Unit Testen, dass ein Ereignis in C # ausgelöst wird, mithilfe von Reflection

Ich möchte testen, ob das Festlegen einer bestimmten Eigenschaft (oder allgemeiner das Ausführen von Code) ein bestimmtes Ereignis für mein Objekt auslöst. In dieser Hinsicht ist mein Problem ähnlich wieUnit testet, dass ein Ereignis in C # @ ausgelöst wi, aber ich brauche viele dieser Tests und ich hasse Boilerplate. Ich suche also nach einer allgemeineren Lösung mit Reflektion.

Ideally, ich würde gerne so etwas machen:

[TestMethod]
public void TestWidth() {
    MyClass myObject = new MyClass();
    AssertRaisesEvent(() => { myObject.Width = 42; }, myObject, "WidthChanged");
}

Für die Implementierung desAssertRaisesEvent, Ich bin so weit gekommen:

private void AssertRaisesEvent(Action action, object obj, string eventName)
{
    EventInfo eventInfo = obj.GetType().GetEvent(eventName);
    int raisedCount = 0;
    Action incrementer = () => { ++raisedCount; };
    Delegate handler = /* what goes here? */;

    eventInfo.AddEventHandler(obj, handler);
    action.Invoke();
    eventInfo.RemoveEventHandler(obj, handler);

    Assert.AreEqual(1, raisedCount);
}

ie Sie sehen, liegt mein Problem in der Erstellung einesDelegate des entsprechenden Typs für dieses Ereignis. Der Delegat sollte nichts anderes tun, als @ aufzurufeincrementer.

Wegen all des syntaktischen Sirups in C # ist meine Vorstellung davon, wie Delegaten und Ereignisse wirklich funktionieren, etwas verschwommen. Dies ist auch das erste Mal, dass ich mich in Gedanken versuche. Was ist der fehlende Teil?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage