【问题标题】:mocking a method using Moq framework doesn't return expected result使用 Moq 框架模拟方法不会返回预期结果
【发布时间】:2020-12-15 18:03:43
【问题描述】:

我有一个类库,它有 2 个类和一个接口,如下所示。
主类:

    public class Class1 
    {
        int a=5 ,b=9;
        private Interface1 iHelper;
        public Class1(Interface1 _inter)
        {
            iHelper = _inter;
        }
        public int getData()
        {
            int result = iHelper.AddNumbers(a, b);
            return result;
        }

    }

HelperClass 类:

class HelperClass : Interface1
    {
        public int AddNumbers(int a, int b)
        {
            return a + b;
        }
    }

界面:

public interface Interface1
    {
        int AddNumbers(int a, int b);
    }

现在,我正在尝试测试方法getData()。我已经使用 Moq 模拟了 AddNumbers 方法,如下所示。

[TestMethod()]
public void getDataTest()
{
     int a = 3, b = 5;
     int c = 8;
     var mockService = new Mock<Interface1>();
     mockService.Setup(x => x.AddNumbers(a,b)).Returns(c);

     Class1 obj = new Class1(mockService.Object);
     var result = obj.getData();
     int final = result;
 } 

当我调试这个测试时,它返回值 0。
据我了解,当我们模拟任何方法时,它必须在测试时返回模拟值。在这种情况下,我将AddNumbers 方法的返回值模拟为 8。所以它应该返回 8。但是,它返回的是 0。

谁能解释我做错了什么。

编辑:实际上,Class1 中ab 的值是动态的。在示例代码中,我对其进行了硬编码。而且,我不想测试AddNumbers 方法。无论如何,我希望它返回一些固定值。在这种情况下,我希望它返回 8。

【问题讨论】:

  • a 和 b 的值实际上是动态的。所以请不要使用硬编码的值。
  • 对于造成的混乱,我深表歉意,我已相应地编辑了问题。

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


【解决方案1】:

您在模拟期望中使用明确的数字指定对AddNumbers 的调用。只有当这些显式值被赋予AddNumbers 时,才会返回 8。如果您不关心AddNumbers 的实际参数,则需要以忽略参数的方式指定您的期望(例如通过It.IsAny&lt;&gt;

mockService.Setup(x => x.AddNumbers(It.IsAny<int>(),It.IsAny<int>())).Returns(c);

另见https://github.com/Moq/moq4/wiki/Quickstart“匹配参数”部分。

【讨论】:

    【解决方案2】:

    因为Class1 中的变量abgetDataTest 中定义的变量不同。使用相同的值:

    [TestMethod()]
    public void getDataTest()
    {
         int a = 5, b = 9; // here
         int c = 14; // and here
         var mockService = new Mock<Interface1>();
         mockService.Setup(x => x.AddNumbers(a,b)).Returns(c);
    
         Class1 obj = new Class1(mockService.Object);
         var result = obj.getData();
         int final = result;
     } 
    

    【讨论】:

    • 实际上,在 Class1 中,a 和 b 的值本质上是动态的。我在示例代码中对其进行了硬编码。我不想测试 AddNumbers 方法,所以我在嘲笑它。所以我只是为 a 和 b 取 2 个值并返回值 8,不管 Class1 中 a 和 b 的实际值是什么。
    • Mock 的论点非常直白。如果你告诉它使用59 调用函数会返回14。该函数59 模拟。没有其他组合将有实现。您可以使用It 中的特殊值告诉它使用任何值实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多