2013-02-07 10 views
5

Wie würden Sie fälschen die folgenden gehen:Faking eine generische Methode FakeItEasy

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

Was ich möchte, ist, dass die Fälschung einfach zurückzuversetzen Argument ist ohne Änderungen. Ich möchte jedoch überprüfen, dass die Fälschung genau einmal aufgerufen wurde. Ein Anwendungsfall ist unten angegeben:

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

das heißt die falschen Bedürfnisse als Pass zu handeln durch, aber ich brauche auch verwendet worden, um es zu überprüfen, um die Lage sein wird.

Was ist der beste Weg, um darüber zu gehen?

[Bitte sorgen Sie sich nicht um das erfundene Beispiel ... es gibt eine Menge Dinge, unter der Decke gehen, aber ich habe es vereinfacht oben auf das Beispiel unten.]

+1

tun, dass es nicht mehr als einmal, verwendet wird, mindestens einmal oder verwendet genau einmal verwendet? Was sollte passieren, wenn es diese Bedingung nicht erfüllt? Sollte diese Schnittstelle eine 'numInvocations'-Eigenschaft haben? Sie können verifizieren, dass es nicht mehr als einmal einfach * mehr * genannt wird, aber wenn Sie wissen, ob es nicht aufgerufen wurde, brauchen Sie eine Möglichkeit, Feedback zu geben. – Servy

+0

Ohne Generika beteiligt, kann ich das gleiche tun mit var fake = A.Fake (); A.CallTo (() ==> fake.SomeMethod (A ._)) .ReturnsLazily (x => x.GetArgument (0)); .... A.CallTo (Fälschung) .MustHaveHappened (Repeated.Exactly.Once); Ich kann nicht herausfinden, wie das gleiche mit der Func Generika zu tun ist dort. Ich habe versucht, eine Dummy-Implementierung der Schnittstelle zu erstellen, und das kann die Durchleitung tun, aber da das konkret ist, kann FakeItEasy nicht überprüfen, dass es verwendet wurde. – ashic

+0

Wenn Sie also sicherstellen müssen, dass es genau einmal passiert ist, soll die Methode eine Klasse zurückgeben, die zwei Eigenschaften hat, "NumInvokations" und diese Funktion. Übergeben Sie die Funktion an anderer Stelle, und stellen Sie fest, ob 'NumInvokations' danach gleich Eins ist. – Servy

Antwort

2

Würde dies Ihr Problem lösen ? Es wird durch das Prädikat übergeben und auch überprüfen, dass ApplyFilter genau einmal

Sie überprüfen, hieß wollen
[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

Während das funktionieren würde, während das T als int angegeben wird, suche ich nach einer generischen Version, die für jeden Typ funktionieren sollte. Die folgende Art von Shows, was ich versuche zu erreichen: http://pastebin.com/fJgi6ikj Mit anderen Worten, die Fälschung sollte für * alle * IMessage arbeiten, ohne den genauen Typ angeben zu müssen. – ashic