使用 Moq 框架模拟方法没有 return 预期结果
mocking a method using Moq framework doesn't return expected result
我有一个 class 库,它有 2 个 class 和一个接口,如下所示。
主要 Class:
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;
}
}
助手Class Class :
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;
}
当我调试这个测试时,它是 returning 值 0。
据我了解,当我们模拟任何方法时,它必须在测试时 return 模拟值。在这种情况下,我将 AddNumbers
方法的 return 值模拟为 8。因此它应该 return 8.But 而不是 returning 0。
任何人都可以解释我做错了什么。
EDIT:实际上,Class1 中 a
和 b
的值是动态的。在示例代码中,我对其进行了硬编码。而且,我不想测试 AddNumbers
方法。无论如何,我都希望它 return 一些固定值。在这种情况下,我希望它 return 8.
因为 Class1
中的变量 a
和 b
不同于 getDataTest
中定义的变量。使用相同的值:
[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;
}
您在模拟期望中使用显式数字指定对 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 部分 "Matching Arguments"。
我有一个 class 库,它有 2 个 class 和一个接口,如下所示。
主要 Class:
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;
}
}
助手Class Class :
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;
}
当我调试这个测试时,它是 returning 值 0。
据我了解,当我们模拟任何方法时,它必须在测试时 return 模拟值。在这种情况下,我将 AddNumbers
方法的 return 值模拟为 8。因此它应该 return 8.But 而不是 returning 0。
任何人都可以解释我做错了什么。
EDIT:实际上,Class1 中 a
和 b
的值是动态的。在示例代码中,我对其进行了硬编码。而且,我不想测试 AddNumbers
方法。无论如何,我都希望它 return 一些固定值。在这种情况下,我希望它 return 8.
因为 Class1
中的变量 a
和 b
不同于 getDataTest
中定义的变量。使用相同的值:
[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;
}
您在模拟期望中使用显式数字指定对 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 部分 "Matching Arguments"。