DEV Community

Discussion on: Which contentious opinions in programming actually matter?

Collapse
 
rbanffy profile image
Ricardo Bánffy

Another question that has generated some heated discussions is mocking for testing. Usually, we mock for performance reasons or to test different hard-to-replicate (say, time/date dependent) behavior, but I often see what I can describe as "overmocking" - checking whether a method was called depending on input provided, or the parameters it was called with. This is a way to increase your code coverage (as code that depends on the opaque object being manipulated is counted), but often stems from hard-to-test code that's within that logic.

Ideally, all the code you build is easy to test with little setup and teardown. You shouldn't need to test the language (whether foo.bar(baz) actually calls method bar of object foo with baz as parameter) but should test whether the parameters you generated and the method you'd select are the right ones, if possible outside the code that only depends on a correct implementation of the language runtime. In order to do that, you'll implement those as methods or functions (they feel like functions in my case) and test them in isolation (which will be faster, BTW, which one of the excuses I see for overmocking).