【问题标题】:Can mock objects setup to return two desired results?可以模拟对象设置以返回两个所需的结果吗?
【发布时间】:2014-06-12 18:34:26
【问题描述】:

可以使用模拟对象返回多个期望的结果,如下所示?

mockObject.Setup(o => o.foo(It.IsAny<List<string>>())).Returns(fooBall);
mockObject.Setup(o => o.foo(It.IsAny<int>())).Returns(fooSquare);

【问题讨论】:

  • 用什么模拟框架?
  • 构建时间远远大于有人在这里回答这个问题所花费的时间。 :(

标签: c# unit-testing mocking moq


【解决方案1】:

是的,您可以使用这些设置。因此foo 方法调用的参数是不同的(任何整数和任何字符串列表),这里有两种不同的设置,每个都有自己的返回值。如果您有相同的参数,那么最后一个设置将替换以前的设置。

请记住 - 每个设置都是由您调用的成员和您传递的参数定义的。

【讨论】:

    【解决方案2】:

    在您的示例中,因为两个 foo 方法采用不同的参数类型,所以它们是重载,正如 Sergey 所说,对于编译器和 Moq,它们被视为完全独立的方法。

    在您希望为 same 方法返回不同结果的特定情况下,根据输入的值,您可以使用 It.Is&lt;&gt; 和谓词匹配器来指定过滤器为应用于参数。从最通用到最具体的定义这些,例如只关注o.foo(int) 重载:

    mockObject.Setup(o => o.foo(It.IsAny<int>())).Returns(defaultFoo);
    mockObject.Setup(o => o.foo(It.Is<int>(i => i == 5))).Returns(fooBall);
    mockObject.Setup(o => o.foo(It.Is<int>(i => i > 50 && i % 2 == 0)))
       .Returns(fooSquare);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      相关资源
      最近更新 更多