Search code examples
tddmockingrhino-mocksassertions

Asserting that a method is called exactly one time


I want to assert that a method is called exactly one time. I'm using RhinoMocks 3.5.

Here's what I thought would work:

[Test]
public void just_once()
{
    var key = "id_of_something";

    var source = MockRepository.GenerateStub<ISomeDataSource>();
    source.Expect(x => x.GetSomethingThatTakesALotOfResources(key))
        .Return(new Something())
        .Repeat.Once();

    var client = new Client(soure);

    // the first call I expect the client to use the source
    client.GetMeMyThing(key);

    // the second call the result should be cached
    // and source is not used
    client.GetMeMyThing(key);
}

I want this test to fail if the second invocation of GetMeMyThing() calls source.GetSomethingThatTakesALotOfResources().


Solution

  • Here's how I'd verify a method is called once.

    [Test]
    public void just_once()
    {
        // Arrange (Important to GenerateMock not GenerateStub)
        var a = MockRepository.GenerateMock<ISomeDataSource>();
        a.Expect(x => x.GetSomethingThatTakesALotOfResources()).Return(new Something()).Repeat.Once();
    
        // Act
        // First invocation should call GetSomethingThatTakesALotOfResources
        a.GetMeMyThing();
    
        // Second invocation should return cached result
        a.GetMeMyThing();
    
        // Assert
        a.VerifyAllExpectations();
    }