繁体   English   中英

RhinoMock - 模拟同一个类的多个存根

[英]RhinoMock - mocking multiple stubs for the same class

假设我有一个从我正在测试的MainClass方法中调用的类。

public class MainClass
{
    private readonly SubClass;
    // constructor not shown
    public method TestMethod()
    {
        var data = SubClass.MethodA();

        // ...some code

        var moreData = SubClass.MethodB(someOtherData);

        // ...more code
    }
}

使用 RhinoMock,我想为SubClass.MethodA()创建一个存根以在测试中返回一组指定的数据,但是在调用SubClass.MethodB() ,我想调用原始实现。

我不想将SubClass'两个方法分解为它们自己的类,因为它们适合SubClass 在 RhinoMock 中有没有办法在调用同一个类中的另一个方法(不是存根)时存根一个方法?

为此,我将使用提取和覆盖测试模式以及一个简单的存根。 虽然这并没有明确使用 Rhino,但可以用于您的场景。

如果您不想走这条路,请考虑通过构造函数、公共设置器或参数将子类注入 MainClass,然后您可以首先对模拟子类进行更多控制。

这个想法是创建一个子类存根可以覆盖的虚拟方法,以控制被测类的一部分的行为。

public class MainClass
{
    private readonly SubClass _subClass;

    // constructor not shown
    public void TestMethod()
    {
        var data = SubClassMethodACall();

        // ...some code

        var someOtherData = "";
        var moreData = _subClass.MethodB(someOtherData);

        // ...more code
    }

    protected virtual string SubClassMethodACall()
    {
        return _subClass.MethodA();
    }
}

public class SubClass
{

    public string MethodA()
    {
        return null;
    }

    public string MethodB(string s)
    {
        return null;
    }
}

namespace Tests.Unit
{
    public class MainClassStub : MainClass
    {
        private readonly string _returnValueForMethodA;

        public MainClassStub(string returnValueForMethodA)
        {
            _returnValueForMethodA = returnValueForMethodA;
        }

        protected override string SubClassMethodACall()
        {
            return _returnValueForMethodA;
        }
    }

    [TestFixture]
    public class TestClass
    {
        [Test]
        public void TestMethod()
        {
            var mainClass = new MainClassStub("this is the test value returned");
            //.. rest of test
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM