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

时间:2016-08-03 08:37:09

标签: c# asp.net unit-testing 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)

}

我从函数和单元测试用例中返回 2 ,检查值 1 。根据我的理解,测试用例应该失败。但我得到成功的消息。我如何验证返回值正是我所期待的?如果它返回的不是1,我想失败测试。

1 个答案:

答案 0 :(得分:2)

您当前的设置将跳过方法的执行,而不是盲目地&#34;返回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"));
}

为了从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"));
}

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