为了测试另一个类,我想为接口 IFoo 创建一个存根:
public interface IFoo
{
int DoSomething(int value);
}
存根在 SetUp (或 TestInitialize )中创建 - 测试夹具的方法并存储在属性中,因为几乎所有测试方法都需要 IFoo :
this.Foo = MockRepository.GenerateStub<IFoo>();
由于IFoo.DoSomething只需返回所有情况下传递的值,除了一个我将此行为添加到 SetUp 方法:
this.Foo.Stub(f => f.DoSomething(0)).IgnoreArguments().Return(0).WhenCalled(mi => mi.ReturnValue = mi.Arguments[0]);
但是,现在,一个测试需要不同的行为:如果传递的值等于另一个常量,则应返回常量,而不是返回传递的参数。以下方法(在测试方法本身中编写)不工作:
this.Foo.Stub(f => f.DoSomething(42)).Return(43);
之前指定的更通用的存根似乎会覆盖更具体的存根。
有没有办法在RhinoMock对象上指定特定和一般存根?
一种解决方法是在测试方法本身中重新创建存根 - 我想避免重复。不过,我可以忍受这个版本
我也不想要的是通过约束明确排除一般声明中的“42”,因为这会对其他测试产生负面影响。
调用 BackToRecord 也不是一个选项,因为它似乎也重置了其他存根。
感谢您的回答!
答案 0 :(得分:1)
我认为不可能“重置”期望。在这种情况下,我会避免在设置中设置这个模拟,而是我会创建一个方法来轻松设置它并从每个测试中调用它:
private IFoo SetUpFoo()
{
IFoo foo = MockRepository.GenerateStub<IFoo>();
foo.Stub(f => f.DoSomething(0)).IgnoreArguments().Return(0).WhenCalled(mi => mi.ReturnValue = mi.Arguments[0]);
}
然后在每个需要标准foo的测试中使用此方法:
[Test]
public void StandardTest()
{
IFoo foo = SetUpFoo();
...
}
在您的特殊情况下,您必须手动创建foo并设置期望:
[Test]
public void SpecialTest()
{
IFoo foo = MockRepository.GenerateStub<IFoo>();
foo.Stub(f => f.DoSomething(42)).Return(43);
...
}
当然,您会得到一些代码重复,但至少可以明确哪些预期用于哪个测试。
答案 1 :(得分:0)
我刚刚找到了实际“覆盖”存根/期望的解决方案: Rhino Mocks: How to clear previous expectations on an object?
应用于我的问题我现在可以写:
this.Foo.Stub(f => f.DoSomething(42)).Return(43).Repeat.Any();
Any的文档说:
重复该方法任意次。这具有特殊的影响,因为此方法现在将忽略排序。
因此,这似乎既不是错误也不是未记录的功能。