Ich habe einen Code, der PropertyChanged
Ereignisse auslöst , und ich möchte einen Unit-Test durchführen können, um sicherzustellen, dass die Ereignisse korrekt ausgelöst werden.
Der Code, der die Ereignisse auslöst, ist wie folgt
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
}
}
}
}
Ich erhalte einen schönen grünen Test aus dem folgenden Code in meinen Komponententests, der Delegaten verwendet:
[TestMethod]
public void Test_ThatMyEventIsRaised()
{
string actual = null;
MyClass myClass = new MyClass();
myClass.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
actual = e.PropertyName;
};
myClass.MyProperty = "testing";
Assert.IsNotNull(actual);
Assert.AreEqual("MyProperty", actual);
}
Wenn ich dann jedoch versuche, die Einstellung der Eigenschaften wie folgt zu verketten:
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
MyOtherProperty = "SomeValue";
}
}
}
public string MyOtherProperty
{
set
{
if (_myOtherProperty != value)
{
_myOtherProperty = value;
NotifyPropertyChanged("MyOtherProperty");
}
}
}
Mein Test für das Ereignis schlägt fehl - das Ereignis, das erfasst wird, ist das Ereignis für die MyOtherProperty.
Ich bin mir ziemlich sicher, dass das Ereignis ausgelöst wird, meine Benutzeroberfläche reagiert wie es ist, aber mein Delegat erfasst nur das letzte Ereignis, das ausgelöst wird.
Ich frage mich also:
1. Ist meine Methode zum Testen von Ereignissen korrekt?
2. Ist meine Methode zum Auslösen verketteter Ereignisse korrekt?
quelle
Wenn Sie TDD ausführen, können durch Ereignistests viele sich wiederholende Codes generiert werden. Ich habe einen Ereignismonitor geschrieben, der einen viel saubereren Ansatz für das Schreiben von Komponententests für diese Situationen ermöglicht.
Bitte lesen Sie meine Antwort auf das Folgende für weitere Details.
Unit-Test, dass ein Ereignis in C # mithilfe von Reflektion ausgelöst wird
quelle
Dies ist sehr alt und wird wahrscheinlich nicht einmal gelesen, aber mit einigen coolen neuen .net-Funktionen habe ich eine INPC Tracer-Klasse erstellt, die Folgendes ermöglicht:
Siehe Inhalt: https://gist.github.com/Seikilos/6224204
quelle
Unten finden Sie einen leicht geänderten Andrew-Code, der nicht nur die Abfolge der ausgelösten Ereignisse protokolliert, sondern auch zählt, wie oft ein bestimmtes Ereignis aufgerufen wurde. Obwohl es auf seinem Code basiert, finde ich es in meinen Tests nützlicher.
quelle
Basierend auf diesem Artikel habe ich diesen einfachen Assertions-Helfer erstellt:
Mit diesem Methodenhelfer wird der Test wirklich einfach.
quelle
Schreiben Sie nicht für jedes Mitglied einen Test - das ist viel Arbeit
(Vielleicht ist diese Lösung nicht für jede Situation perfekt - aber sie zeigt einen möglichen Weg. Möglicherweise müssen Sie sie für Ihren Anwendungsfall anpassen.)
Mithilfe der Reflektion in einer Bibliothek können Sie testen, ob Ihre Mitglieder alle korrekt auf das Ereignis reagieren, bei dem sich Ihr Eigentum geändert hat:
Der folgende Code kann als Bibliothek verwendet werden und zeigt, wie die folgende generische Klasse getestet wird
Die Tests Ihrer Klasse können jetzt als geschrieben werden. (Vielleicht möchten Sie den Test in "Ereignis ist da" und "Ereignis mit korrektem Namen ausgelöst" aufteilen - Sie können dies selbst tun.)
Klasse
quelle
Ich habe hier eine Erweiterung vorgenommen:
Es gibt die Verwendung:
quelle