Rhino Mocks在返回时Stub不同的实例

本文关键字:实例 Stub Mocks 返回 Rhino | 更新日期: 2023-09-27 18:00:23

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

public interface A
{
}
public interface B
{
    A GetA();
}

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

[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()));
}

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

如果运行此测试,它将通过,因为实例不同。但是,我觉得这个代码不是很清楚。如何使Rhino Mocks在每次调用时生成新实例?

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

Rhino Mocks在返回时Stub不同的实例

[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()调用,但如果在WhenCalled委托参数中设置ReturnValue,则该值将被重写。

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