Yesterday I found annoying flaw in Rhino mocks. I expected that when you said Repeat.Twice() the expectation is that the method would be executed exactly 2 times and if no - expectation should be failed. But looks like that it saying "at least twice". (Despite the fact that there is as well Repeat.AtLeastOnce())
So here is my setup:
And that test is not failing unfortunately. You can even replace Times(2) with anything else - just the number of executions should be less then the actual number - test still would be green. And you can replace it with Once() or AtLeastOnce() - no difference at all!
And here is how you can write that test to fail. Finally, checking for exact number of calls!
So here is my setup:
public class Foo
{
public virtual void DoStuff()
{
Console.WriteLine("DoStuff");
}
}
public class Bar
{
public Foo foo { get; set; }
public void CallFoo(int max)
{
for (int i = 0; i < max; i++)
{
foo.DoStuff();
}
}
}
And that test is not failing unfortunately. You can even replace Times(2) with anything else - just the number of executions should be less then the actual number - test still would be green. And you can replace it with Once() or AtLeastOnce() - no difference at all!
[Test]
public void MockTest()
{
var mock = MockRepository.GenerateMock();
mock.Expect(x => x.DoStuff())
.Repeat.Times(2);
var bar = new Bar();
bar.foo = mock;
bar.CallFoo(3);
mock.VerifyAllExpectations();
}
And here is how you can write that test to fail. Finally, checking for exact number of calls!
[Test]
public void MockTest2()
{
var mock = MockRepository.GenerateMock();
var bar = new Bar();
bar.foo = mock;
bar.CallFoo(3);
mock.AssertWasCalled(x => x.DoStuff(),
y => y.Repeat.Times(2));
}
No comments:
Post a Comment