c# - 使用 Moq 框架模拟方法不会返回预期结果

标签 c# .net unit-testing moq mstest

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

    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;
        }
    }

接口(interface):

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。

最佳答案

您指定调用 AddNumbers在你的模拟期望中有明确的数字。仅当将这些显式值赋予 AddNumbers 时将返回 8。如果不关心实际参数到AddNumbers您需要以忽略参数的方式指定您的期望(例如通过 It.IsAny<> )

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

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

关于c# - 使用 Moq 框架模拟方法不会返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50963331/

相关文章:

.net - 在 .NET 中使线程向另一个线程发出信号的最佳方法是什么?

unit-testing - vue.js 单元测试 - 安装钩子(Hook)错误

c# - 检查添加的 TimeSpans 是否超过 TimeSpan.MaxValue

c# - C#应用程序无法访问kubernetes服务?

c# - 数组 C# 中的递增计数器

c# - 如何从标准的命令行参数中读取文件? (模拟 Python 的文件输入)

c# - 循环中的局部范围矛盾

c# - 为什么需要双冒号 (::) 运算符来解决 namespace 冲突?

python - 如何测试这段代码

python - Pyresttest 运行目录中的所有测试