基于对象参数的模拟方法返回

Ale*_*lex 4 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";
}
Run Code Online (Sandbox Code Playgroud)

然后我在单元测试中调用这个方法,并且需要根据对象值模拟返回类型:

_Service.Setup(x => x.methodName(new methodName { value = 1}).Returns("Yes");
_Service.Setup(x => x.methodName(new methodName { value = 2}).Returns("No");
Run Code Online (Sandbox Code Playgroud)

我知道我写的东西是错误的——但我怎样才能做到这一点?

Mat*_*ard 5

你在正确的轨道上。使用 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");
Run Code Online (Sandbox Code Playgroud)

第一行设置模拟以在使用任何值调用此方法时返回“无论如何”。以下两行覆盖了特定值的行为。

我会查看 Moq 的快速入门指南以获取更多详细信息,特别是匹配参数部分。

  • @Artem,Moq 适用于接口。在这种情况下,`_Service` 必须被定义为某个接口,因此`virtual` 关键字不会出现在其中。 (2认同)