我有以下(简化)代码:
public string methodName(ClassType object)
{
If(object.value == 1)
return "Yes";
else If(object.value == 2)
return "No";
else
return "whatever";
}
然后我在单元测试中调用此方法,并且需要根据对象值模拟返回类型:
_Service.Setup(x => x.methodName(new methodName { value = 1}).Returns("Yes");
_Service.Setup(x => x.methodName(new methodName { value = 2}).Returns("No");
我知道自己写的是错误的-但是我该怎么实现呢?
答案 0 :(得分:3)
您在正确的轨道上。使用Moq,您需要准确指定应与每个输入匹配的设置。您是这样做的:
_Service.Setup(x => x.methodName(It.IsAny<ClassType>())).Returns("whatever");
_Service.Setup(x => x.methodName(It.Is<ClassType>(o => o.value == 1))).Returns("Yes");
_Service.Setup(x => x.methodName(It.Is<ClassType>(o => o.value == 2))).Returns("No");
该行的第一行将模拟程序设置为在使用任何值调用此方法时均返回“ whatever”。以下两行覆盖了特定值的行为。
我会查看Moq的Quickstart指南以了解更多详细信息,尤其是Matching Arguments部分。
答案 1 :(得分:1)
我对Moq不太熟悉,但是我认为下面的应该做。您应该为参数的每个可能值提供一个Returns
:
_Service.Setup(x => x.methodName(It.Is<ClassType>(y => y.value == 1))).Returns("Yes");
_Service.Setup(x => x.methodName(It.Is<ClassType>(y => y.value == 2))).Returns("No");
这样,只要您的methodName
方法用object.value == 1
调用,就返回"Yes"
,而object.value == 2
解析为返回"No"
的方法。
但是对我来说,这意义不大,因为您以完全相同的行为嘲笑methodName
的行为。我想这只是为了研究。