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

时间:2018-02-05 23:28:06

标签: c# .net unit-testing rhino-mocks

假设我有一个正在我正在测试的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中调用一个方法,同时在同一个类中调用另一个方法(不是存根)?

1 个答案:

答案 0 :(得分:1)

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

如果您不想沿着这条路走下去,可以考虑通过构造函数,公共setter或参数将Subclass注入MainClass,然后您可以先控制mocking子类。

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

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
        }
    }
}