验证MOQ单元测试方法返回值

验证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")); 
} 

这将允许模拟推迟到没有提供模拟设置的任何方法的基本实现。

+0

我真的很抱歉。我无法理解你的观点。我已经更新了这个问题,以便如果在问题中存在任何混淆,都可以避免。我嘲笑界面而不是课堂。使用实例即时调用方法。这是不对的? –

+0

@TomCruise请检查最新的答案。如果你仍然需要帮助,请告诉我。 –

+0

第二种方法即时获取错误在Moq.dll中发生类型'System.NotSupportedException'的异常,但未在用户代码中处理 –