The least bad solution

Sometimes I look over the options and constraints to choose something suboptimal. I have to pick the least-bad solution.

I recently chose a least-bad way to write a test. In a Rails app, the most sensible thing to solve my problem was something like this:

[code lang=text] def propagate_from_child_to_parent model_parents.find_each(&:do_a_sideeffect) end [/code]

In the test, I ended up having to write this assertion

[code lang=text] expect_any_instance_of(ModelParents).to receive(:do_a_sideeffect) [/code]

This kind of stub and assertion is clearly a smell. But, consider the alternatives:

  • stub out the child model object under so that find_each returns a stub object that I can make sure do_a_sideffect is called on
  • try to hack around ActiveRecords associations so it returns the same object as I inject in my test
  • seek out some other result of do_a_sideeffect that I could assert on

In the end, it felt like the shady mock+assertion was the best choice. Using that particular assertion says “slow down and pay attention, a special thing is happening here”. It’s not something I want to do every time, but it was the least bad solution in this context.

Adam Keys @therealadam