This answer hit a nerve with me on something I have never understood with how you handle parameter types in dynamic languages vs. a static language (my perspective being informed or deformed - as you prefer) from Java.
Given a method foo that takes a parameter bar in a dynamic language, there is no enforcement at compile time of the type of bar. The answer linked above (and the answer I have generally seen to this) is that you need to unit test properly in a dynamic language.
But at some point something outside the unit will call that method. Say this is a heavy weight object that will be mocked in any unit tests of classes that use it. Now you have many classes which call this method, and you need to change the type. To keep it simple, it used to take a number, but now requires an alpha numeric, and you need to use a method specifically available on string and not on a number object with the new requirement.
How do you change it and know the calling code will be fixed? Sure if you just change it, your unit tests will fail, but since you need to change it on purpose, you would ostensibly fix your unit tests. How do you know to fix the calling code? I don't just mean how conceptually do you know, I mean how do you know you have found all the callers and can really say it is changed.
It would seem that only very comprehensive integration tests would give you that assurance. Am I missing something?