2016-05-25 11 views
5

To może nie być coś, co jest możliwe, ale pomyślałem, że i tak zapytam. Czy mimo to mogę wyodrębnić tę metodę, aby drugie wywołanie zostało zgaszone za pomocą parametru podanego w testowanej przeze mnie metodzie?C# Rhino wyśmiewa stubmethod z zakodowanym parametrem w drugim wywołaniu

Metoda skrótową:

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

    return result ?? FindSupportDetails("en-us"); 
} 

Moja Aktualny Test:

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); 
} 

i supportDetails obiekt używany w teście:

supportDetails = new SupportDetails[] 
     { 
      new SupportDetails() 
      { 
       ContactSupportDetailsID = 1, 
       LanguageKey = "en-us" 
      }, 
      new SupportDetails() 
      { 
       ContactSupportDetailsID = 2, 
       LanguageKey = "en-gb" 
      }, 
      new SupportDetails() 
      { 
       ContactSupportDetailsID = 3, 
       LanguageKey = "es-es" 
      } 
     }; 
+0

Myślę, że możesz po prostu dodać kolejne wywołanie, np. '_repo.Stub (s => s.FindSupportDetails (" en-us ")). Return (supportDetails.Where (sd => sd.LanguageKey ==" en- us "). SingleOrDefault());' – stuartd

+0

Czy to nie wystarczy zastąpić pierwszy stub? –

+0

Nie wierzę, ponieważ przekazywany parametr jest inny. Minęło trochę czasu, odkąd użyłem Rhino. W przeciwnym razie użyj [składnia powtórzeń] (http://www.richard-banks.org/2010/07/mocking-comparison-part-6-multiple.html) – stuartd

Odpowiedz

4

Poprawna i najbardziej eleganckie rozwiązanie Twoim problemem jest użycie metody Do:

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

Func podniesie bez względu argument ten został przekazany do FindSupportDetails, a następnie prawidłowe SupportDetails wybiorą.