验证MOQ单元测试方法返回值
问题描述:
我有以下类和测试类的书面使用起定量:验证MOQ单元测试方法返回值
public class Mytest : testin
{
public int getId(int id)
{
int s = 2;
return s;
}
}
测试类:
private Mock<testin> _mock;
[TestInitialize]
public void Setup()
{
_mock = new Mock<testin>();
}
[TestMethod]
public void returngetId()
{
// Build up our mock object
_mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1)
}
我从函数返回和在单元测试用例中检查值。根据我的理解,测试用例应该会失败。但即时获得成功的消息。我如何验证返回值正是我期望的?如果返回的结果不是1,我想要通过测试。
答
您当前的设置将跳过该方法的执行,而是“盲目地”返回1.如果希望执行该方法,则不应该嘲笑该方法。如果您删除安装线,您的测试用例确实会失败。一般来说,如果你不需要执行,你只应该模拟一个方法。
澄清:
线_mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1)
配置您的模仿对象,这样当你调用getId
方法,而不是执行它,价值1
总是被退回。所以,下面的测试将通过:
[TestMethod]
public void returngetId_Always1()
{
// ... Build up our mock object
_mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1);
Assert.AreEqual(1, _mock.Object.getId("foo"));
Assert.AreEqual(1, _mock.Object.getId("bar"));
}
为了得到实际执行的方法来从模拟中调用,你要嘲笑类,而不是接口,具有以下配置:
[TestMethod]
public void returngetId_CallBase()
{
var mock = new Mock<MyTest>() { CallBase = true };
// add other method setups here. DO NOT setup the getId() method.
Assert.AreEqual(2, _mock.Object.getId("foo"));
Assert.AreEqual(2, _mock.Object.getId("bar"));
}
这将允许模拟推迟到没有提供模拟设置的任何方法的基本实现。
我真的很抱歉。我无法理解你的观点。我已经更新了这个问题,以便如果在问题中存在任何混淆,都可以避免。我嘲笑界面而不是课堂。使用实例即时调用方法。这是不对的? –
@TomCruise请检查最新的答案。如果你仍然需要帮助,请告诉我。 –
第二种方法即时获取错误在Moq.dll中发生类型'System.NotSupportedException'的异常,但未在用户代码中处理 –