Ayende @ Rahien

Refunds available at head office

Rhino Mocks 3.5 Design Decisions: To be strict or not?

Here is an interesting problem. What should this piece of code do?

var stubSmsSender = MockRepository.GenerateStub<ISmsSender>();
// test code
stubSmsSender.VerifyAllExpectations();

Right now this is a no-op.

But since stubs are explicitly not mocks, they shouldn't be verified. Should I throw here? For something which is a test design decision?

Comments

Chad Myers
06/29/2008 02:47 AM by
Chad Myers

I say "Yes, throw" or at least make it the default option.

I would say that the developer might be confused here about what a Stub does and so is trying to use it incorrectly. They will likely get a false positive in their test and continue on without any indication there's a problem.

Matt Hinze
06/29/2008 02:49 AM by
Matt Hinze

Throw. Make it difficult to do the incorrect thing..

Jeremy Gray
06/29/2008 03:12 AM by
Jeremy Gray

Upon further thought while reading the subsequent post on the behaviour of stubs versus mocks, I think I need to clarify my "+1 for throwing" to instead say:

+1 for throwing from VerifyAllExpectations calls on stubs and mocks that do not have any expectations set on them.

(That way my preference is consistent regardless of how the whole stubs versus mocks behaviour thing goes ;)

Tim Barcz
06/29/2008 04:33 AM by
Tim Barcz

Why throw? If you say make it difficult to do the incorrect thing, wouldn't a no-op be better than a thrown exception. In other words if the "wrong" thing has no side-effect (being a no-op), why is it the wrong thing at all?

Ayende Rahien
06/29/2008 04:45 AM by
Ayende Rahien

a) user may assume that this is a valid thing to do.

b) this is a bad test design

Scott Hanselman
06/29/2008 07:29 AM by
Scott Hanselman

throw new StubsAreNotMocksException();

Sidar Ok
06/29/2008 10:24 AM by
Sidar Ok

Why does generate stub return a type that has the ability related to verification at all ? Can't we discard the method at all from generated stub?

Ayende Rahien
06/29/2008 01:48 PM by
Ayende Rahien

Sidar,

VerifyAllExpectation is an extension method on object, therefor, stubs get it as well

Ben Hall
06/29/2008 03:59 PM by
Ben Hall

It's a shame the stub object has this method, ideally they wouldn't. If this can't be changed then Scott's suggestion of throwing an StubsAreNotMocksException(); seems the most logical so they don't end up writing bad tests.

Glenn Kees
06/29/2008 06:02 PM by
Glenn Kees

I am in agreement with Jeremy. If the person crafting the test is a making a call to verify expectations but they have not set any then an exception should be thrown. Perhaps in this case it should throw new NoExpectationsSet(); (to steal a line from Scott's playbook).

Bahador
06/30/2008 07:29 PM by
Bahador

We should not forbid setting expectations on stubs. I know stubs are not mocks, but there are times that I want to just check if a method on a stub is called or not.

So +1 for throwing if any expectations is not set.

Comments have been closed on this topic.