C#Rhino在第二次调用中使用硬编码参数模拟stubmethod

Mat*_*nce 5 .net c# unit-testing rhino-mocks mocking

这可能不是甚至可能的事情,但我想我还是会问.反正我是否存在这个方法,以便使用我正在测试的方法中提供的参数来删除第二个调用?

存根的方法:

public SupportDetails GetSupportDetails(string languageKey)
{
    var result = FindSupportDetails(languageKey);

    return result ?? FindSupportDetails("en-us");
}
Run Code Online (Sandbox Code Playgroud)

我当前的测试:

public void GetsUSDetails_IfLangKeyDoesNotExist()
{
    var langKey = "it-it";

    _repo.Stub(s => s.FindSupportDetails(langKey))
         .Return(supportDetails.Where(sd => sd.LanguageKey == langKey)
                               .SingleOrDefault());

    ISupportRepository repo = _repo;
    var actual = repo.GetSupportDetails(langKey);

    Assert.AreEqual("en-us", actual.LanguageKey);
}
Run Code Online (Sandbox Code Playgroud)

以及测试中使用的supportDetails对象:

supportDetails = new SupportDetails[]
        {
            new SupportDetails()
            {
                ContactSupportDetailsID = 1,
                LanguageKey = "en-us"
            },
            new SupportDetails()
            {
                ContactSupportDetailsID = 2,
                LanguageKey = "en-gb"
            },
            new SupportDetails()
            {
                ContactSupportDetailsID = 3,
                LanguageKey = "es-es"
            }
        };
Run Code Online (Sandbox Code Playgroud)

Old*_*Fox 4

解决您的问题的正确且最优雅的解决方案是使用Do方法:

_repo.Stub(s => s.FindSupportDetails(null))
     .IgnoreArguments()
     .Do((Func<string, SupportDetails>) 
         (langKey => supportDetails.SingleOrDefault(sd => sd.LanguageKey == langKey)));
Run Code Online (Sandbox Code Playgroud)

Func无论传递给什么参数,都会引发,FindSupportDetails然后正确的SupportDetails将选择。