我正在寻找一种让我的测试更清晰的方法,这就是问题所在:
public interface A
{
}
public interface B
{
A GetA();
}
现在,如果我想在 B 上有一个 stub ,并且每次调用 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()));
}
请注意,在 assert 中我调用了 GetA 两次,并将结果设置为 Repeat.Once() 而不是 Repeat.Twice();
如果您运行此测试,它将通过,因为实例不同。但是,我觉得这段代码不是很清楚。你如何让 Rhino Mocks 在每次调用时生成新实例?
注意: 过去我使用过很多技巧,比如在每次返回时使用 Do() 来执行一些更改实例的代码等等,但是有没有类似 .GenerateNewInstance() 或类似的东西?
最佳答案
[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
,该值将被覆盖> 委托(delegate)参数。
关于c# - Rhino Mocks Stub 返回时的不同实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6468073/