2013-02-07 9 views
5

Jak byś go o fałszowanie następujące:Faking metoda rodzajowa FakeItEasy

public interface IBlah 
{ 
    Func<T, bool> ApplyFilter<T>(Func<T, bool> predicate) where T:IMessage; 
} 

Chciałbym to za fałszywe po prostu wrócić to argument, bez żadnych zmian. Chciałbym jednak sprawdzić, czy fałszywy został nazwany dokładnie raz. Przypadek użycia jest podana poniżej:

public class Something 
    { 

    public Something(IBlah blah) { _blah = blah; } 

    public bool DoSomething(SomeValue m, Func<SomeValue, bool> predicate) 
    { 
     Func<SomeValue, bool> handler = _blah.ApplyFilter(predicate); 
     return handler(m); 
    } 
    } 

czyli fałszywe musi działać jako przechodzą przez ale również muszą być w stanie zweryfikować, że został użyty.

Jaki jest najlepszy sposób, aby rozwiązać ten problem?

[Proszę nie martwić się o contrived przykład ... jest wiele rzeczy dzieje się pod kołdrą, ale ja go uprościć do przykładu powyżej.]

+1

Chcesz sprawdzić, czy jest on wykorzystywany nie więcej niż jeden raz, stosuje się co najmniej jeden raz, lub używane tylko raz? Co powinno się stać, jeśli nie spełnia tego warunku? Czy ten interfejs powinien mieć właściwość 'numInvocations'? Możesz zweryfikować, że nie będzie to * więcej * niż * * * * wystarczająco łatwo, ale wiedząc, że nie zostało wywołane ... potrzebujesz sposobu na wyrażenie opinii. – Servy

+0

Bez udziału leków, mogę zrobić to samo z var fake = A.Fake (); A.CallTo (() ==> fake.SomeMethod (A ._)) . ZwracaLazily (x => x.GetArgument (0)); .... A.CallTo (fałszywy) .MustHaveHappened (Powtórzony.Tylko.Oobecnie); Nie mogę wymyślić, jak zrobić to samo z generatorem Func . Próbowałem stworzyć Dummy implementację interfejsu i to może zrobić przejście, ale ponieważ jest to konkretne, FakeItEasy nie może zweryfikować, czy zostało użyte. – ashic

+0

Biorąc pod uwagę, że musisz upewnić się, że zdarzyło się dokładnie wtedy, gdy chcesz, aby metoda zwróciła klasę, która ma dwie właściwości, 'NumInvokations' i tę funkcję. Przekaż funkcję gdzie indziej, a następnie sprawdź, czy 'NumInvokations' jest równe jeden. – Servy

Odpowiedz

2

Czy to rozwiąże problem ? Będzie przechodzić przez orzecznika, a także sprawdzić, czy applyFilter nazwano dokładnie raz

[Fact] 
    public void TestFeature() 
    { 
     var fake = A.Fake<IBlah>(); 
     A.CallTo(() => fake.ApplyFilter(A<Func<int, bool>>.Ignored)).ReturnsLazily(x => 
      { 
       return x.GetArgument<Func<int, bool>>("predicate"); 
      }); 
     var something = new Something(fake); 
     var result = something.DoSomething(1, x => x > 1); 

     Assert.False(result); 
     A.CallTo(() => fake.ApplyFilter(A<Func<int, bool>>.Ignored)).MustHaveHappened(Repeated.Exactly.Once); 
    } 
+0

Podczas gdy to będzie działać podczas określania T do int, szukam ogólnej wersji, która powinna działać dla każdego typu. Poniższy rodzaj pokazuje, co próbuję osiągnąć: http://pastebin.com/fJgi6ikj Innymi słowy, fałszywy powinien działać dla * dowolnej * wiadomości błyskawicznej, bez konieczności podawania dokładnego typu. – ashic

Powiązane problemy