我试图模拟一个方法,它编译时没有错误,但是当我运行测试时会出现smth奇怪的情况。实际上方法不会模拟,或者我不理解smth ...(
这是一段代码:
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)。
怎么了?
答案 0 :(得分:0)
您的代码实际上并不使用您创建的模拟 - 因为您可以将Obstacle
更改为IObjs
作为range
的参数,而不是传递模拟而不是Obstacle
的新实例:
public virtual bool range(IObjs ob, double range)....
class Obstacle : IObjs ...
Assert.IsTrue(r.range(obstacleMock, 0.5));
答案 1 :(得分:0)
我建议您将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);
}
}