Rhino Mocks不模拟方法

本文关键字:方法 模拟 Mocks Rhino | 更新日期: 2023-09-27 18:15:52

我试图模拟一个方法,它编译没有错误,但是当我运行测试时,奇怪的事情发生了。实际上方法并不嘲弄,或者可能我不理解史密斯…(

下面是代码:

public class Robot
{   ....
    public virtual bool range(IObs ob, double range)
    {
        double dist = ob.distanceSq(this);
        if (dist < range)
            return true;
        else
            return false;
    }
}

public interface IObs
{
    double distanceSq(Robot r);
}

单元测试:

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        MockRepository mocks = new MockRepository();
        IObs obstacleMock = mocks.CreateMock<IObs>();
        Robot r = new Robot();
        Expect.Call(obstacleMock.distanceSq(r)).IgnoreArguments()
           .Constraints(Is.Anything())
            .Return(5.5);
        Assert.IsTrue(r.range(obstacleMock, 0.5));
    }
}

我模拟distanceSq()。当我调试我的测试时,我看到ob.distanceSq(this)是0.0。(1.5) .

怎么了?

Rhino Mocks不模拟方法

您的代码实际上没有使用您创建的mock -因为您可以将Obstacle更改为IObjs作为range的参数,然后传递mock而不是Obstacle的新实例:

public virtual bool range(IObjs ob, double range)....
class Obstacle : IObjs ...
Assert.IsTrue(r.range(obstacleMock, 0.5));

我建议您将RinoMocks版本升级到3.6,并使用新的语法。

另外,如果您正在为iob使用模拟,您也可以验证是否调用了distanceSq方法。

我没有在这段代码中验证distanceSq方法中的参数,但是您可以确保传入的是正确的Robot实例。

单元测试仍然会失败,因为5.5大于0.5

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Rhino.Mocks;
namespace Rhino
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var r = new Robot();
            var obstacleMock = MockRepository.GenerateMock<IObs>();
            obstacleMock.Expect(x => x.ditanceSq(Arg<Robot>.Is.Anything)).Return(5.5);
            //use this line to ensure correct Robot is used as parameter
            //obstacleMock.Expect(x => x.ditanceSq(Arg<Robot>.Is.Equal(r))).Return(5.5);
            var result = r.range(obstacleMock, 0.5);
            obstacleMock.VerifyAllExpectations();
            Assert.IsTrue(result);
        }
    }
    public class Robot
    {
        public virtual bool range(IObs ob, double range)
        {
            return  ob.ditanceSq(this) < range;         
        }
    }
    public interface IObs
    {
        double ditanceSq(Robot r);
    }
}