【问题标题】:How to set a default return value in a Rhino Mocks stub如何在 Rhino Mocks 存根中设置默认返回值
【发布时间】:2019-08-01 20:22:51
【问题描述】:

假设我想使用 Rhino Mocks 生成以下接口的存根:

public interface IFooBar
{
  string Foo(string bar);
}

我在我的一套单元测试的一次性设置方法中存根方法Foo,以及以下约束:

  var foobar = MockRepository.GenerateStub<IFooBar>();
  foobar.Stub(f => f.Foo(Arg<string>.Is.Equal("string1")))
    .Repeat.Any()
    .Return("result1");
  foobar.Stub(f => f.Foo(Arg<string>.Is.Equal("string2")))
    .Repeat.Any()
    .Return("result2");
  //etc...

目前,如果参数bar 不匹配上述任何约束,则方法Foo 将默认返回null。在这些情况下,有什么方法可以告诉它返回 null 以外的东西(例如空字符串或其他任意字符串)?

我尝试在网上搜索文档、SO 和其他地方,但还没有找到符合我要求的解决方案。

我尝试将其添加到开头,希望随后对 foobar.Stub 的调用将在满足更具体的约束时“覆盖”此默认行为:

  foobar.Stub(f => f.Foo(Arg<string>.Is.Anything))
    .Repeat.Any()
    .Return(string.Empty);

不幸的是,事实并非如此;添加上述导致 Fooalways 返回一个空字符串,就好像其他 Foo.Stub 调用从未发生过一样。

我可以做相反的事情,并在所有其他 Foo.Stub 调用之后进行上述调用,从而有效地覆盖所有剩余的可能情况。这种方法的缺点是,一旦我这样做了,我就不能再添加任何其他可能特定于一个特定单元测试但不是其他任何单元测试的约束。

最坏的情况,我可以将所有常见的Foo.Stub 调用提取到一个可重用的方法中,以便在每个单元测试开始时调用,然后是更多特定于测试的存根,最后是覆盖其余情况的上述存根。我只是想知道是否有更简单的解决方案。

【问题讨论】:

    标签: c# unit-testing rhino-mocks


    【解决方案1】:

    使用输入参数提供方法实现

    您可以使用.Do() 方法提供该方法的完整实现,而不是使用带有简单值的.Return()。这也允许您访问输入参数。如果需要,您可以定义一个委托并调用该委托。

    例如

    //Arrange
    var foobar = MockRepository.GenerateStub<IFooBar>();
    foobar.Stub(_ => _.Foo(Arg<string>.Is.Anything))
      .Repeat.Any()
      .Do((Func<string, string>)(input => {
          if (input == "string1") {
              return "result1";
          } else if (input == "string2") {
              return "result2";
          }
          return string.Empty; // or some other arbitrary string
      }));
    
    //Act & Assert to prove it works (using FluentAssertions)
    foobar.Foo("string1").Should().Be("result1");
    foobar.Foo("string2").Should().Be("result2");
    foobar.Foo(null).Should().Be(string.Empty); // or some other arbitrary string
    

    【讨论】:

    • 谢谢!这应该提供我需要的所有灵活性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2011-11-21
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多