【问题标题】:validate MOQ unit test method return value验证 MOQ 单元测试方法返回值
【发布时间】:2016-08-03 22:19:33
【问题描述】:

我有以下使用 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)

}

我从函数中返回 2,并在单元测试用例中检查值 1。据我了解,测试用例应该失败。但我得到了成功的信息。我如何验证返回值正是我所期望的?如果返回的不是 1,我希望测试失败。

【问题讨论】:

    标签: c# asp.net unit-testing moq


    【解决方案1】:

    您当前的设置将跳过方法的执行,而是“盲目地”返回 1。如果您希望执行该方法,则不应模拟该方法。如果您删除设置行,您的测试用例确实会失败。一般来说,你应该只模拟一个方法,如果你需要它不被执行。


    澄清一下:

    _mock.Setup(x =&gt; x.getId(It.IsAny&lt;int&gt;())).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"));
    }
    

    为了从 mock 中获取要调用的方法的实际实现,您必须使用以下配置来模拟类,而不是接口:

    [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”类型的异常,但未在用户代码中处理
    • @TomCruise 堆栈跟踪是什么?
    • 非虚拟(在 VB 中可覆盖)成员上的无效设置:x => x.getId(It.IsAny())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多