Clojure: Expectations Ignore A Variable Number Of Args In An Interaction Test
Over the past year I've written the same test a few times.
(expect (interaction (my-fn anything) :never) (a-fn-that-shouldnt-call-my-fn))
This test accomplishes what I'm looking for when I write it -
verification that my-fn isn't called. However, it doesn't prevent me
from future regressions where my-fn is called with 0, 2, or 2+
arguments. After being bitten by this issue a few times I decided to add
an argument matching function that will accept any value for the
argument at it's index, and any value for all of the arguments at a
greater index. This argument matching function is
The following example is similar to what's above, except any call to my-fn will result in a failure
(expect (interaction (my-fn anything&) :never) (a-fn-that-shouldnt-call-my-fn))
My original intent was to protect against the scenario I described
above*; however, what I ended up with is actually flexible enough to
allow me to test other situations as well. For example, I've often found
myself testing that a log message was written at a certain level, but
not being interested in testing the actual message. The logging I'm
working with allows a variable number of arguments, so anything& is
perfect for verifying that no matter what args are passed in, the tests
passes as long as the level is set correctly.
(expect (interaction (log :warn anything&)) (log :warn "order" 1 "at" (time/now)))
anything& matching function gives me an extra bit of flexibility that can come in handy at times.
*which is similar to verifyZeroInteractions in mockito
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)