Search code examples
c#rhino-mocks

Counting method calls in Rhino Mocks


So: I'd like to count method calls in Rhino Mocks with something more specific than Any(), Once() or AtLeastOnce(). Is there any mechanism for doing this?


Solution

  • The trick is to use Repeat.Times(n), where n is the number of times.

    Suprisingly the below test will pass, even if the method is called more often than expected:

    [Test]
    public void expect_repeat_n_times_does_not_work_when_actual_greater_than_expected() {
      const Int32 ActualTimesToCall = 6;
      const Int32 ExpectedTimesToCall = 4;
    
      var mock = MockRepository.GenerateMock<IExample>();
      mock.Expect(example => example.ExampleMethod()).Repeat.Times(ExpectedTimesToCall);
    
      for (var i = 0; i < ActualTimesToCall; i++) {
          mock.ExampleMethod();
      }
    
      // [?] This one passes
      mock.VerifyAllExpectations();
    }
    

    To work around this use the below method:

    [Test]
    public void aaa_repeat_n_times_does_work_when_actual_greater_than_expected() {
      const Int32 ActualTimesToCall = 6;
      const Int32 ExpectedTimesToCall = 4;
    
      var mock = MockRepository.GenerateMock<IExample>();
    
      for (var i = 0; i < ActualTimesToCall; i++) {
          mock.ExampleMethod();
      }
    
      // This one fails (as expected)
      mock.AssertWasCalled(
          example => example.ExampleMethod(),
          options => options.Repeat.Times(ExpectedTimesToCall)
      );
    }
    

    Source: http://benbiddington.wordpress.com/2009/06/23/rhinomocks-repeat-times/ (look there for an explanation)

    EDIT: only edited to summarise at the start, thanks for the useful reply.