[英]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.