[TIP] [python] Re: Mock Testing Patterns
Michael Foord
fuzzyman at voidspace.org.uk
Mon Nov 19 10:08:00 PST 2007
Gustavo Niemeyer wrote:
> Hello Michael,
>
>
>> Well, the pattern is usually more like:
>>
>> setup mocks
>> action
>> assertions
>>
>> So yes, there is some setup to put the mocks in place.
>>
>> This pattern works *fine*, but we aren't yet using a mocking library. I
>> wonder if there are any that will support us in this pattern rather than
>> switching to recording expectations.
>>
>
> I find it unlikely. As Martin explained, the setup work is needed in any
> case, as you have to specify return values, ordering between expressions,
> actions executed, and so on. If you're going to setup these things ahead
> of time, you're actually already defining expectations.
>
Hmm... not directly you're not. You may patch a method with a listener
so that you can make an assert as to what arguments it was called with -
but you don't specify those arguments ahead of time.
You do the setup, then perform the action, then make assertions about
the results.
> Another detail I find important in that regard is that I want the mocking
> library to, as much as possible, explode right at the spot where the
> expectation was broken. This usually makes fixing the situation much more
> straightforward.
>
>
Well, failing at a specific assertion is usually exact enough for us. I
still find the 'record -> replay' approach backwards and less intuitive.
I guess it is a question of taste, but I don't think you're going to
persuade me. :-)
I've rolled my own Mock class that lets me do what I want, and as is the
way with Python it turns out to be less than 50 LOC. I'll post it
shortly. It currently doesn't do the patching for you - but at Resolver
we do this with a decorator pattern that I think is quite nice - so I'll
add this shortly.
Michael
http://www.manning.com/foord
More information about the testing-in-python
mailing list