【问题标题】:Rhino Mocks doesnt mock a methodRhino Mocks 不模拟方法
【发布时间】:2013-11-14 18:36:43
【问题描述】:

我试图模拟一个方法,它编译时没有错误,但是当我运行测试时会发生奇怪的事情。实际上方法没有嘲笑或者我不明白......(

这是一个代码:

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)。

怎么了?

【问题讨论】:

  • @GrantWinney - 在这种情况下使用 deciaml 可能没有用 - double 对于大多数距离计算来说应该绰绰有余。

标签: c# mocking rhino-mocks


【解决方案1】:

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

public virtual bool range(IObjs ob, double range)....
class Obstacle : IObjs ...

Assert.IsTrue(r.range(obstacleMock, 0.5));

【讨论】:

  • 我做了这个更改,但方法仍然没有模拟。但是,现在,在调试器中,我得到 0.0 而不是 0.0000000000000099999999999999984。
【解决方案2】:

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

另外,如果您使用的是 IObs 的模拟,您不妨验证是否调用了 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多