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

时间:2010-08-17 18:03:00

标签: c# rhino-mocks

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

即:

public interface IOptions
{
    string Something { get; }
}

[TestFixture]
public class Tester
{
    MockRepository mocks;
    IOptions someOptions;
    string expectedXml;

    [Setup]
    public void Setup()
    {
        mocks = new MockRepository();
        someOptions = mocks.DynamicMock<IOptions>();
        //Something that would go here.
        // I.e. SetupResult.For(someOptions.Something).Return("default");
    }
    [Teardown]
    public void Teardown()
    {
        mocks.ReplayAll();
        using (var ms = new MemoryStream())
        {
            var unitUnderTest = new SomeOptionsWriter(ms);
            unitUnderTest.Write(someOptions);
            Assert.AreEqual(expectedXml, Encoding.Utf8.GetString(ms.ToArray()));
        }
        mocks.VerifyAll();
    }
    [Test]
    public void SomeTest()
    {
        expectedXml = "<root><default></default></root>";
        //Relies on default behavior
    }
    [Test]
    public void SomeTest2()
    {
        expectedXml = "<root><sub></sub></root>";
        Expect.Call(someOptions.Something).Return("sub");
    }
}

如何使用Rhino Mocks实现这一目标?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

不要使用记录/重播语义。使用AAA(安排/动作/断言)。在每个测试中,您可以使用两行代码来存根IOptions

IOptions someOptions = MockRepository.GenerateStub<IOptions>();
someOptions.Stub(o => o.Something).Return("default");

答案 2 :(得分:0)

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