[rspec-users] Adding Test Spy into Rspec mocking framework

Pat Maddox pergesu at gmail.com
Mon Sep 15 08:49:11 EDT 2008

On Mon, Sep 15, 2008 at 8:43 AM, David Chelimsky <dchelimsky at gmail.com> wrote:
> On Mon, Sep 15, 2008 at 7:39 AM, Pat Maddox <pergesu at gmail.com> wrote:
>>> So I'm proposing the idea of adding 'should_have_received' and test_spy
>>> in Rspec:
>>> ---
>>> x = test_spy('like a mock but more into espionage')
>>> #Action which does not fail on unexpected method but just records calls.
>>> some.action(x)
>>> x.should_have_received(:method).and_returned_with('some string')
>> I actually started implementing this the day before Dan posted that.
>> It works, but I don't have all the nice error messages and stuff yet.
>> Will take me a couple days to get around to finishing it probably.
> Have you implemented this within the mock framework or as a separate concept?

It's just a new matcher.  I did mess with the mock framework a little
in that I record calls every time it receives a message, rather than
only when it hits method_missing.

I will be restructuring the mock internals to better support this, I
think.  But of course it won't change the public API, and mocks will
still have the fail-fast behavior by default if that's what you want.

Basic example of what I'm doing...

o = stub("stub", :foo => true)
o.should have_received(:foo)

It's not a true spy in the sense that it accepts any message (you can
use :null_object for that).  My only desire here was to unify the
format of interaction-based tests with the arrange/act/assert format
typical of state-based tests.


More information about the rspec-users mailing list