rspec/rspec-mocks — pull request #241 by jferris (2013-03-15 21:45:56+00:00)
Title: Add test spies

* Adds have_received matcher
* Extends Proxy/MethodDouble/MessageExpectation
* Records all invocations on stubbed methods
* Resolves #220.

I ended up including a `have_received` method in rspec-mocks and not touching rspec-expectations, because:

* `have_received` returns a good result object (a matcher) that you can use for boolean checks and a failure message, which we want in rspec-mocks
* `have_received` would make little sense in rspec-expectations if you weren't also using rspec-mocks

I resurrected some invocation recording functionality in `received_messages?` that seems to have been somewhat broken for a while. It was added in 2007 for ZenTest support, and seems to have been moved forward with every release without modification since then. Previously it only ever recorded messages for null object mocks; I updated it to record messages for any stubbed method.

The matcher works in negative cases using `should_not`/`not_to`; I decided not to implement `never`, because combining `should_not` and `never` has proven to be confusing to bourne users. I figured it would be easier to just have one, standard way to write negative expectations.

There was one weird situation I wasn't sure how to deal with on `MethodDouble`. Every `MethodExpectation` expects to have a `expected_from` backtrace line, because previously errors would be inserted where the expectation was set. This isn't necessary with `have_received`, because it raises a normal exception from where the expectation failed. I ended up passing a useless backtrace line with `caller(1)[0]` that isn't ever used.

Feedback welcome.