[rspec-users] How do I specify that a class does not receive any message

320 views
Skip to first unread message

Andrew Premdas

unread,
Aug 21, 2012, 4:02:10 PM8/21/12
to rspec-users
I want to write

it "should ..." do
  Client.should_not_receive(any_message)
  # do something here that might do Client.xxx
end

TIA

Andrew

--
------------------------
Andrew Premdas

J. B. Rainsberger

unread,
Aug 21, 2012, 4:12:09 PM8/21/12
to rspec-users
On Tue, Aug 21, 2012 at 5:02 PM, Andrew Premdas <apre...@gmail.com> wrote:
I want to write

it "should ..." do
  Client.should_not_receive(any_message)
  # do something here that might do Client.xxx
end

I might be wrong, but if you use a mock object and set no expectations on it, it will expect no messages. Have you tried that?
-- 
J. B. (Joe) Rainsberger :: http://www.jbrains.ca ::
http://blog.thecodewhisperer.com
Author, JUnit Recipes
Free Your Mind to Do Great Work :: http://www.freeyourmind-dogreatwork.com

Bas Vodde

unread,
Aug 21, 2012, 10:37:36 PM8/21/12
to rspec-users

JB is right.

Sometimes, for clarity, it is useful to add should_not, but for functionality it is usually not needed.

Bas
> _______________________________________________
> rspec-users mailing list
> rspec...@rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

_______________________________________________
rspec-users mailing list
rspec...@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

J. B. Rainsberger

unread,
Aug 22, 2012, 8:52:36 AM8/22/12
to rspec-users
On Tue, Aug 21, 2012 at 11:37 PM, Bas Vodde <ba...@odd-e.com> wrote:

JB is right.

Sometimes, for clarity, it is useful to add should_not, but for functionality it is usually not needed.

I know JMock has never() for this people. Should RSpec-mocks have something like object.should_receive(:nothing).
-- 

David Chelimsky

unread,
Aug 22, 2012, 9:07:30 AM8/22/12
to rspec-users
On Wed, Aug 22, 2012 at 7:52 AM, J. B. Rainsberger <m...@jbrains.ca> wrote:
> On Tue, Aug 21, 2012 at 11:37 PM, Bas Vodde <ba...@odd-e.com> wrote:
>>
>>
>> JB is right.
>>
>> Sometimes, for clarity, it is useful to add should_not, but for
>> functionality it is usually not needed.
>
>
> I know JMock has never() for this people. Should RSpec-mocks have something
> like object.should_receive(:nothing).

never() is not a catch all for _all_ messages. It is for a specific
message, just like it is in rspec-mocks

# rspec
object.should_receive(:msg).never

#jmock
never(object).msg()




> --
> J. B. (Joe) Rainsberger :: http://www.jbrains.ca ::
> http://blog.thecodewhisperer.com
> Author, JUnit Recipes
> Free Your Mind to Do Great Work :: http://www.freeyourmind-dogreatwork.com
>
>

J. B. Rainsberger

unread,
Aug 22, 2012, 10:16:46 AM8/22/12
to rspec-users
On Wed, Aug 22, 2012 at 10:07 AM, David Chelimsky <dchel...@gmail.com> wrote:
On Wed, Aug 22, 2012 at 7:52 AM, J. B. Rainsberger <m...@jbrains.ca> wrote:
> On Tue, Aug 21, 2012 at 11:37 PM, Bas Vodde <ba...@odd-e.com> wrote:
>>
>>
>> JB is right.
>>
>> Sometimes, for clarity, it is useful to add should_not, but for
>> functionality it is usually not needed.
>
>
> I know JMock has never() for this people. Should RSpec-mocks have something
> like object.should_receive(:nothing).

never() is not a catch all for _all_ messages. It is for a specific
message, just like it is in rspec-mocks

  # rspec
  object.should_receive(:msg).never

  #jmock
  never(object).msg()

In JMock, you can write this:

never(object);

and this means "never anything". Just like

ignoring(object);
allowing(object);

which each equate to mock().as_null_object().
-- 

David Chelimsky

unread,
Aug 22, 2012, 10:36:43 AM8/22/12
to rspec-users
On Wed, Aug 22, 2012 at 9:16 AM, J. B. Rainsberger <m...@jbrains.ca> wrote:
> On Wed, Aug 22, 2012 at 10:07 AM, David Chelimsky <dchel...@gmail.com>
> wrote:
>>
>> On Wed, Aug 22, 2012 at 7:52 AM, J. B. Rainsberger <m...@jbrains.ca> wrote:
>> > On Tue, Aug 21, 2012 at 11:37 PM, Bas Vodde <ba...@odd-e.com> wrote:
>> >>
>> >>
>> >> JB is right.
>> >>
>> >> Sometimes, for clarity, it is useful to add should_not, but for
>> >> functionality it is usually not needed.
>> >
>> >
>> > I know JMock has never() for this people. Should RSpec-mocks have
>> > something
>> > like object.should_receive(:nothing).
>>
>> never() is not a catch all for _all_ messages. It is for a specific
>> message, just like it is in rspec-mocks
>>
>> # rspec
>> object.should_receive(:msg).never
>>
>> #jmock
>> never(object).msg()
>
>
> In JMock, you can write this:
>
> never(object);
>
> and this means "never anything". Just like
>
> ignoring(object);
> allowing(object);
>
> which each equate to mock().as_null_object().

Perhaps it goes without saying, but I was not aware of that ;)

As you noted earlier this thread (not quoted above) RSpec::Mocks::Mock
instances (returned by double(), mock(), or stub()) are strict by
default - e.g. they'll complain about any unexpected messages.
Obviously that does not account for any real objects.

I'm open to adding an API for this, but not
object.should_receive(:nothing) since that syntax is for declaring
expected messages.

Other ideas welcome.

J. B. Rainsberger

unread,
Aug 22, 2012, 11:11:58 AM8/22/12
to rspec-users
I am at your service.
 
As you noted earlier this thread (not quoted above) RSpec::Mocks::Mock
instances (returned by double(), mock(), or stub()) are strict by
default - e.g. they'll complain about any unexpected messages.
Obviously that does not account for any real objects.

I'm open to adding an API for this, but not
object.should_receive(:nothing) since that syntax is for declaring
expected messages.

I agree that that doesn't work. Is object.should_receive_nothing completely out of the question?
-- 

Lenny Marks

unread,
Aug 22, 2012, 1:38:34 PM8/22/12
to rspec-users
+1 for me. I've found myself on occasion using should_not_receive(:some_message). OK, see a failing spec, make it pass, but what about when the collaborator method is renamed. All those should_not_receive expectations will still pass no matter what. It would be great to have object.should_receive(:nothing) instead. This would make life easier when collaborators are stubbed out with :as_null_object stubs.

-lenny

Lenny Marks

unread,
Aug 22, 2012, 2:08:40 PM8/22/12
to rspec-users
I mean some equivalent to object.should_receive(:nothing). Maybe object.should_receive_nothing ??
Reply all
Reply to author
Forward
0 new messages