簡體   English   中英

如何在 Rhino Mocks 存根中設置默認返回值

[英]How to set a default return value in a Rhino Mocks stub

假設我想使用 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);

不幸的是,情況並非如此。 添加上述內容會導致Foo始終返回一個空字符串,就好像其他Foo.Stub調用從未發生過一樣。

我可以做相反的事情,所有其他Foo.Stub調用之后進行上述調用,有效地覆蓋了所有剩余的可能情況。 這種方法的缺點是一旦我這樣做了,我就不能再添加任何其他約束,這些約束可能特定於一個特定的單元測試,但不是任何其他的。

在最壞的情況下,我可以將所有常見的Foo.Stub調用提取到一個可重用的方法中,以便在每個單元測試開始時調用,然后是更多特定於測試的存根,最后是覆蓋剩余情況的上述存根。 我只是想知道是否有更簡單的解決方案。

使用輸入參數提供方法實現

而不是使用的.Return()用一個簡單的值,你可以提供一個全面推行使用方法.Do()方法。 這也允許您訪問輸入參數。 如果需要,您可以定義一個委托並調用該委托。

例如

//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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM