根据对象参数返回模拟方法

时间:2018-09-26 13:01:55

标签: c# unit-testing moq

我有以下(简化)代码:

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");

我知道自己写的是错误的-但是我该怎么实现呢?

2 个答案:

答案 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的行为。我想这只是为了研究。