views:

1045

answers:

1

I would like to set up a return value

_stubRepository.Stub(Contains(null)).IgnoreArguments().Return(true);

but then in a specific test, override that expectation to return false.

Something like

_stubRepository.ClearExpectations();  //<- this does not exist, I'm just making something up
_stubRepository.Stub(Contains(null)).IgnoreArguments().Return(false);

Notice, I do not want the expectation to return false on the second call, I want to override the first expectation.

This would help simplify my testing scenario greatly.

+15  A: 

There are three ways:

You can reset the expectations by using BackToRecord

I have to admit that I never really used it because it is awkward.

// clear expectations, an enum defines which
_stubRepository.BackToRecord(BackToRecordOptions.All);
// go to replay again.
_stubRepository.Replay();

Edit: Now I use it sometimes, it is actually the cleanest way. There should be an extension method (like Stub) which does it - I think it just got forgotten. I would suggest to write your own.

You can use Repeat.Any()

It 'breaks' the order of the stubbed definition and "overrides" previous definitions. But it's somehow implicit. I use it sometimes because it is easy to write.

_stubRepository.Stub(x => x.Contains(null))
  .IgnoreArguments()
  .Return(false)
  .Repeat.Any();

You can create a new mock

Trivial, but explicit and easy to understand. It is only a problem if you want to keep plenty of definitions and only change one call.

_stubRepository = MockRepository.GenerateMock<IRepository>();
_stubRepository.Stub(x => x.Contains(null))
  .IgnoreArguments()
  .Return(false);
Stefan Steinegger
In internal Rhino Mock speak, using Repeat. Any creates a repeatable expectation, which trump normal expectations during playback. I recommend using BackToRecord, though.
Richard Szalay
Ah, figured it all out except for the Replay() call.
George Mauer
This is a thing only really known by people using RhinoMocks since 3.4 or older. RhinoMocks worked with Record-Replay, this means that a mock had to be set into replay mode explicitly. With 3.5, fortunately this has gone, mocks are always in replay mode (at least for the custom code). Until you put it back to record mode - except of clearing expectations I see no reason to do it. I already wanted to write a patch for this two lines to comfortably reset the expectations.
Stefan Steinegger
public static void ResetExpectations<T>(this T mock) where T : class { mock.BackToRecord(BackToRecordOptions.Expectations); mock.Replay();}I've got a bunch of handy rhino mocks extensions that I should put on google code actually..
George Mauer