2012-10-16 7 views
5

Die Anwendung, die ich testen bin, ist voll von Ereignissen basierend auf kundenspezifischen Teilnehmer, wie dies:Wie richte ich ein Ereignis in FakeItEasy für ein Ereignis basierend auf einem benutzerdefinierten Delegaten ein?

public delegate void NameChangedHandler(string name); 
public event NameChanged OnNameChanged; 
... 
public void ChangeYourName(string newName) 
{ 
    if(NameChanged != null) 
     NameChanged(newName); 
} 

ich die Klasse produzieren diese Ereignisse verspotten wollen und diese Ereignisse der Klasse unter Test zu erhöhen.

Ich weiß, dass FakeItEasy Raise.With() verwenden kann, um Ereignisse mit den traditionellen Ereignissignaturen MyHandler(object sender, EventArgs e) oder MyHandler(EventArgs e) auszulösen, aber ich weiß nicht, was ich in meiner Situation tun soll.

Irgendwelche Ideen?

+0

Ich habe genau das gleiche heute gerade gerannt. Kann hier jemand helfen? – jdscolam

+1

Ich glaube, die Antwort ist, dass FakeItEasy das nicht kann. Meine Lösung bestand darin, mein Event umzufunktionieren, um EventArgs zu übernehmen. – pduncan

+1

Es gibt ein Problem für dieses https://github.com/FakeItEasy/FakeItEasy/issues/30 –

Antwort

3

Ab FakeItEasy 2.0.0 ist dies nun möglich.

Die Raising Events documentation topic hat die ganze Geschichte, aber das Wesentliche ist, dass Sie

fake.OnNameChanged += Raise.With<NameChanged>(newName); 

Wie immer verwenden würde, muss das Ereignis virtuell sein.

0

Sie könnten immer ChangeYourName virtuell machen und die Methode ersetzen.

A.CallsTo(()=>fakeClass.ChangeyourName(A<string>._)).Invokes((x)=>invokeMockEvent(x)); 

Wenn das nicht das, was man wollte, ich nehme an, wenn ChangeYourName Öffentlichkeit Sie könnten nur Ihre gefälschte Klasse erstellen

var class = new Class(); 
class.OnNameChanged += (x)=> 
{ 
    Assert.AreEqual(x,"tim"); 
}; 

class.ChangeYourName("tim"); 
Verwandte Themen