Rhino.Mocks如何测试抽象类方法调用

时间:2010-08-09 09:16:12

标签: rhino-mocks

我正在尝试测试我想测试的方法是否正确调用了一些外部(模拟)对象。

以下是示例代码:

using System;

using Rhino.Mocks;

using NUnit.Framework;

namespace RhinoTests
{
    public abstract class BaseWorker
    {
        public abstract int DoWork(string data);
    }

    public class MyClass
    {
        private BaseWorker worker;
        public BaseWorker Worker
        {
            get { return this.worker; }
        }

        public MyClass(BaseWorker worker)
        {
            this.worker = worker;
        }

        public int MethodToTest(string data)
        {
            return this.Worker.DoWork(data);
        }
    }

    [TestFixture]
    public class RhinoTest
    {
        [Test]
        public void TestMyMethod()
        {
            BaseWorker mock = MockRepository.GenerateMock<BaseWorker>();
            MyClass myClass = new MyClass(mock);

            string testData = "SomeData";
            int expResponse = 10;

            //I want to verify, that the method forwards the input to the worker
            //and returns the result of the call

            Expect.Call(mock.DoWork(testData)).Return(expResponse);
            mock.GetMockRepository().ReplayAll();

            int realResp = myClass.MethodToTest(testData);

            Assert.AreEqual(expResponse, realResp);
        }
    }
}

当我运行此测试时,我得到:

TestCase 'RhinoTests.RhinoTest.TestMyMethod'
failed: System.InvalidOperationException : Invalid call, the last call has been used or no call has been made (make sure that you are calling a virtual (C#) / Overridable (VB) method).
    at Rhino.Mocks.LastCall.GetOptions[T]()
    at Rhino.Mocks.Expect.Call[T](T ignored)
    RhinoTest.cs(48,0): at RhinoTests.RhinoTest.TestMyMethod()

在进行任何调用之前,会在Expect.Call行上抛出异常。

我如何处理此问题 - 即如何检查被测方法是否正确转发呼叫?

这是.Net 2.0项目(我现在暂不改变),所以没有“x =&gt;”语法:(

1 个答案:

答案 0 :(得分:2)

我必须承认,我不完全确定这里发生了什么,但使用Rhino.Mocks 3.6和更新的语法,它对我来说很好用:

[Test]
public void TestMyMethod()
{
    MockRepository mocks = new MockRepository();
    BaseWorker mock = mocks.StrictMock<BaseWorker>();

    MyClass myClass = new MyClass(mock);
    string testData = "SomeData";
    int expResponse = 10;

    using (mocks.Record())
    {
        //I want to verify, that the method forwards the input to the worker
        //and returns the result of the call
        Expect.Call(mock.DoWork(testData)).Return(expResponse);
    }

    using (mocks.Playback())
    {
        int realResp = myClass.MethodToTest(testData);
        Assert.AreEqual(expResponse, realResp);
    }
}

它与Rhino.Mocks版本没有任何关系。使用旧语法,我会得到与您相同的错误。我没有在你的代码中发现任何明显的错误,但话说回来,我已经习惯了这种using语法。

编辑:删除了var关键字,因为您使用的是.NET 2.0。