2012-07-19 3 views
12

Ich brauche genannt wurde, um zu überprüfen, dass ein Verfahren mit einem Objekt eines bestimmten Typs genannt wurde, wie Sie sicherstellen, dass ein Verfahren mit einem Argument eines bestimmten Typs

das ist die Schnittstelle mit der Methode, die ich testen möchten dass es hieß:

interface IPlayer 
{ 
    void Send(object message); 
} 

der Test:

var player1 = A.Fake<IPlayer>(); 
room.AddPlayer(player1); 

room.DoSomething(); 

A.CallTo(() => player1.Send(A<Type1>.Ignored)).MustHaveHappened(); 

da es mehrere Aufrufe player1.Send mit vielen verschiedenen Objekten sind erhalte ich InvalidCastException

weiß jemand, wie man das richtig macht?

Antwort

13

von Entwurf ist, was Sie eigentlich zu tun versuchen:

A.CallTo(() => player1.Send(A<object>.That.IsInstanceOf(typeof(MessageType)))).MustHaveHappened(); 

Der Typ in A <angegeben?> sollte immer der genaue Parametertyp sein, den die Methode annimmt. Ich habe tatsächlich darüber nachgedacht, es zu ändern, so dass Sie den Typ wie gewünscht einschränken können und wenn ich mich richtig erinnere, war der Hauptgrund (aber ich denke, es gab auch andere Gründe), dass es fragiler wäre, wenn Sie Überladungen einführen.

Betrachten wir zum Beispiel, dass Sie die folgenden Überlastung auf iPlayer-Schnittstelle eingeführt:

interface IPlayer 
{ 
    void Send(object message); 
    void Send(Type1 message); 
} 

Sobald Sie vorstellen, diese Bedeutung Ihrer Test Änderungen überlasten.

+0

es ist gut so wie du es gemacht hast, ich dachte es sollte so etwas geben, ich konnte es einfach nicht im Wiki finden – Omu