Rhino Mocks在返回时存根不同的实例

时间:2011-06-24 12:54:21

标签: c# .net tdd mocking rhino-mocks

我正在寻找一种让我的测试更清晰的方法,这就是问题所在:

public interface A
{

}

public interface B
{
    A GetA();
}

现在,如果我想在B上使用存根,并且每次调用GetA时都需要一个新实例,我会这样做:

[Test]
public void TestName()
{
     MockRepository mockery = new MockRepository();

     B b = mockery.Stub<B>();
     b.Stub(x => x.GetA()).Return(mockery.Stub<A>()).Repeat.Once();
     b.Stub(x => x.GetA()).Return(mockery.Stub<A>()).Repeat.Once();

     mockery.ReplayAll();

     Assert.IsFalse(ReferenceEquals(b.GetA(), b.GetA()));
}

请注意,在断言中我调用GetA两次,并且我将结果设置为Repeat.Once()而不是Repeat.Twice();

如果您运行此测试,它将通过,因为实例不同。然而,我没有发现这种代码非常清楚。你如何让Rhino Mocks在每次通话时产生新的实例?

注意: 过去我在每次返回时都使用了许多技巧,使用Do()来执行一些更改实例等的代码,但是在那里像.GenerateNewInstance()或类似的东西?

2 个答案:

答案 0 :(得分:5)

[Test]
public void TestName()
{
      var b = MockRepository.GenerateStub<B>();
      b.Stub(x => x.GetA())
          .WhenCalled(x => x.ReturnValue = MockRepository.GenerateStub<A>());

      Assert.IsFalse(ReferenceEquals(b.GetA(), b.GetA()));
}

在某些情况下,您必须明确添加.Return()调用,但如果在ReturnValue委托参数中设置WhenCalled,则会覆盖该值。

答案 1 :(得分:2)

我在这个问题上打破了很多汗水。它可以像我的回答in this link中所描述的那样完成,但我得出结论,通常会更容易跳过Rhino,并制作自己的虚拟实现。

相关问题