Specifying call counts

marick edited this page Mar 19, 2012 · 4 revisions
Clone this wiki locally

Since most Clojure functions always return the same value for the same arguments, Midje (by default) doesn't care how often a function-under-test calls its prerequisites. For example, in the following called is called three times. That's fine by Midje: as long as a prerequisite is called at least once, it checks out.

     (fact
       (do (called 1) (called 1) (called 1)) => 1
       (provided
         (called 1) => 1))

In some cases, though, you want finer control over how often a prerequisite must be called. If you want a function called exactly once, but no more, specify it like this:

     (fact
       ...
       (provided
         (called 1) => 1 :times 1))

You can also give a collection of integers. The fact checks out if that collection includes the number of times the prerequisite was actually called.

     (fact
       ...
       (provided
         (called 1) => 1 :times (range 2 8)))

Just for grins, you can also give a function that's called with the number of actual prerequisite calls:

     (fact
       ...
       (provided
         (called 1) => 1 :times even?))

Arguments

Prerequisites don't just say that a function was called. They say that it was called with particular arguments. If you don't care about the arguments, you can use the anything checker:

     (fact
       ...
       (provided
         (called anything) => 1 :times even?))

Claiming that a function is not called

One of the common uses of :times is to claim that a prerequisite is never called. In that case, the notation is slightly awkward:

    (fact
      ....
      (provided
        (called anything) => 1 :times 0))

This says that the function-under-test does not call called, but if it did, called would produce 1. That's silly, but it's an unfortunate consequence of how focused Midje is on arrows.