不幸的是,以下模式在RhinoMocks中不起作用:
[SetUp]
public void SetUp ()
{
obj.Stub(s => s.Prop).Returns("a suitable default for all tests");
}
[Test]
public void VerySpecificTest ()
{
obj.Stub(s => s.Prop).Returns("specific value, valid only for this single test");
}
它甚至没有抛出异常(特别糟糕),用户只是不知道为什么第二个Stub()
调用没有任何效果。
然而,有没有办法让这项工作?如何"覆盖"一个属性返回?
答案 0 :(得分:3)
BackToRecord
使存根忘记其先前记录的行为,然后使用Replay
返回播放模式,然后再次存根该属性:
[SetUp]
public void SetUp ()
{
obj.Stub(s => s.Prop).Returns("a suitable default for all tests");
}
[Test]
public void VerySpecificTest ()
{
// Clear recorded expectations and immediately go back to replay mode.
obj.BackToRecord();
obj.Replay();
// Now setup a new expectation.
obj.Stub(s => s.Prop).Returns("specific value, valid only for this single test");
}
此方法的缺点是BackToRecord
会导致存根忘记为其设置的所有期望(不仅是您可能想要覆盖的期望)。有一些hackarounds可以避免这种情况(例如,使用Repeat
,或使用lambda设置初始Stub
,以便稍后可以更改返回值;请参阅例如{{3其中一些),但没有支持的API。