C# 如何在设置方法中为rhino模拟接口设置默认操作,该方法可以在测试方法中为特定行为覆盖?

C# 如何在设置方法中为rhino模拟接口设置默认操作,该方法可以在测试方法中为特定行为覆盖?,c#,rhino-mocks,C#,Rhino Mocks,我想模拟一个作为函数主参数传入的接口,但该方法很复杂,因此我不想为每个测试指定默认值或确切的行为。我希望在设置方法中指定默认值,并根据需要在每个测试中覆盖该方法的特定部分 即: 公共接口操作 { 字符串{get;} } [测试夹具] 公共类测试员 { 嘲弄; 其他选择; 字符串expectedXml; [设置] 公共作废设置() { mocks=新的MockRepository(); someOptions=mocks.DynamicMock(); //一些可以放在这里的东西。 //例如,Set

我想模拟一个作为函数主参数传入的接口,但该方法很复杂,因此我不想为每个测试指定默认值或确切的行为。我希望在设置方法中指定默认值,并根据需要在每个测试中覆盖该方法的特定部分

即:

公共接口操作
{
字符串{get;}
}
[测试夹具]
公共类测试员
{
嘲弄;
其他选择;
字符串expectedXml;
[设置]
公共作废设置()
{
mocks=新的MockRepository();
someOptions=mocks.DynamicMock();
//一些可以放在这里的东西。
//例如,SetupResult.For(someOptions.Something).Return(“默认”);
}
[撕裂]
公共无效拆卸()
{
mocks.ReplayAll();
使用(var ms=new MemoryStream())
{
var unitUnderTest=新的SomeOptionsWriter(毫秒);
unitUnderTest.Write(someOptions);
AreEqual(expectedXml,Encoding.Utf8.GetString(ms.ToArray());
}
mocks.VerifyAll();
}
[测试]
公共测试()
{
expectedXml=“”;
//依赖于默认行为
}
[测试]
public void SomeTest2()
{
expectedXml=“”;
Expect.Call(someOptions.Something).Return(“sub”);
}
}

如何使用Rhino Mock实现这一点?

不要使用录制/重播语义。使用AAA(排列/动作/断言)。在每个测试中,您可以使用两行代码来删除您的
IOptions

IOptions someOptions = MockRepository.GenerateStub<IOptions>();
someOptions.Stub(o => o.Something).Return("default");
IOptions someOptions=MockRepository.generateSub();
Stub(o=>o.Something.Return(“默认”);

不要使用录制/重播语义。使用AAA(排列/动作/断言)。在每个测试中,您可以使用两行代码来删除您的
IOptions

IOptions someOptions = MockRepository.GenerateStub<IOptions>();
someOptions.Stub(o => o.Something).Return("default");
IOptions someOptions=MockRepository.generateSub();
Stub(o=>o.Something.Return(“默认”);

为了完全回答你的问题,我必须跳过@Patrick Steele的答案。使用AAA设置。在SetUp方法中声明默认存根,然后在特定测试方法中重写这些存根。但是,除非重新实例化对象,否则无法删除现有存根

为给定函数添加的最后一个存根将覆盖上一个存根

someOptions.Stub(o => o.Something).Return("default");
someOptions.Stub(o => o.Something).Return("override");

示例中的上述存根在调用时将返回“override”。

为了完全回答您的问题,我必须跳过@Patrick Steele的答案。使用AAA设置。在SetUp方法中声明默认存根,然后在特定测试方法中重写这些存根。但是,除非重新实例化对象,否则无法删除现有存根

为给定函数添加的最后一个存根将覆盖上一个存根

someOptions.Stub(o => o.Something).Return("default");
someOptions.Stub(o => o.Something).Return("override");

示例中的上述存根在调用时将返回“override”。

您可以清除存根或模拟的行为,如中所示。请注意,这将清除所有方法的行为,而不仅仅是一个。

您可以清除存根或模拟的行为,如中所示。请注意,这将清除所有方法的行为,而不仅仅是一个。

如何在Rhino Mock中不使用record/replay语义?请参阅上面显示的代码示例。我不创建模拟存储库,也不调用任何“记录”或“重播”方法。我只是创建一个存根并为属性设置一个假返回值。我现在可以把这个对象传递给一个方法,它会工作的。好的。然后,每个单独的测试如何覆盖存根中指定的行为?如何不对Rhino Mock使用记录/重播语义?请参阅上面显示的代码示例。我不创建模拟存储库,也不调用任何“记录”或“重播”方法。我只是创建一个存根并为属性设置一个假返回值。我现在可以把这个对象传递给一个方法,它会工作的。好的。那么,每个单独的测试如何覆盖存根中指定的行为呢?这有点违背了在设置方法中设置默认值的目的:(@Billy ONeal:如果你在setup方法中创建了许多存根,那就不会了。嗯……这假设我必须进行单元测试的类设计得很好,而不是一个1600行的怪物,它有一个公共方法怪物,它将一个类作为一个参数,在这个类上需要模拟80个方法:(这有点违背了在设置方法中设置默认值的目的,尽管:(@Billy ONeal:如果你在setup方法中创建了许多存根,那就不会了。嗯……这假设我必须进行单元测试的类设计得很好,而不是一个1600行的怪物,它有一个公共方法怪物,它将一个需要模拟80个方法的类作为参数:(如何覆盖存根?如何覆盖存根?