c# - 使用 Moq 框架模拟方法不会返回预期结果
问题描述
我有一个类库,它有 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()
。我已经使用 模拟了AddNumbers
方法Moq
,如下所示。
[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 中的值a
和值是动态的。b
在示例代码中,我对其进行了硬编码。而且,我不想测试AddNumbers
方法。无论如何,我希望它返回一些固定值。在这种情况下,我希望它返回 8。
解决方案
AddNumbers
您使用明确的数字在模拟期望中指定调用。只有当这些显式值被赋予时,AddNumbers
才会返回 8。如果您不关心实际参数,则AddNumbers
需要以忽略参数的方式指定您的期望(例如 via It.IsAny<>
)
mockService.Setup(x => x.AddNumbers(It.IsAny<int>(),It.IsAny<int>())).Returns(c);
另请参阅https://github.com/Moq/moq4/wiki/Quickstart部分“匹配参数”。
推荐阅读
- php - WordPress页面指定菜单
- javascript - 如何检查两个 Class 实例是否具有相同的值
- eclipse - 将同一个项目推送到两个不同的 Git 存储库
- tsql - 从 SQL Server 2008 中的字符串中获取下划线之前的字符并用逗号分隔
- java - Java System.nanoTime() 多个并行调用导致相同的值?
- vb.net - 无法加载 DLL 'mozglue':Geckofx 45.0.1 中的错误
- php - 不能使用碳工厂类
- php - 无法在 WAMP localhost 上运行 laravel 任务调度程序
- c# - 在 XAML 中设置属性的顺序是什么?
- c# - 跟踪到 DLL