J'ai du code qui déclenche des PropertyChanged
événements et j'aimerais pouvoir tester unitaire que les événements sont déclenchés correctement.
Le code qui déclenche les événements est comme
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");
}
}
}
}
J'obtiens un joli test vert à partir du code suivant dans mes tests unitaires, qui utilise des délégués:
[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);
}
Cependant, si j'essaie ensuite de chaîner le réglage des propriétés comme ceci:
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
MyOtherProperty = "SomeValue";
}
}
}
public string MyOtherProperty
{
set
{
if (_myOtherProperty != value)
{
_myOtherProperty = value;
NotifyPropertyChanged("MyOtherProperty");
}
}
}
Mon test pour l'événement échoue - l'événement qu'il capture est l'événement pour MyOtherProperty.
Je suis presque sûr que l'événement se déclenche, mon interface utilisateur réagit comme il le fait, mais mon délégué ne capture que le dernier événement à déclencher.
Je me demande donc:
1. Ma méthode de test des événements est-elle correcte?
2. Ma méthode de génération d' événements chaînés est-elle correcte?
la source
Si vous faites du TDD, les tests d'événement peuvent commencer à générer beaucoup de code répétitif. J'ai écrit un moniteur d'événements qui permet une approche beaucoup plus propre de l'écriture de tests unitaires pour ces situations.
Veuillez consulter ma réponse à ce qui suit pour plus de détails.
Test unitaire qu'un événement est déclenché en C #, à l'aide de la réflexion
la source
Ceci est très ancien et ne sera probablement même pas lu, mais avec de nouvelles fonctionnalités .net cool, j'ai créé une classe INPC Tracer qui permet cela:
Voir l'essentiel: https://gist.github.com/Seikilos/6224204
la source
Vous trouverez ci-dessous un code d'Andrew légèrement modifié qui, au lieu de simplement consigner la séquence d'événements déclenchés, compte plutôt le nombre de fois qu'un événement spécifique a été appelé. Bien qu'il soit basé sur son code, je le trouve plus utile dans mes tests.
la source
Sur la base de cet article, j'ai créé cet assistant d'assertion simple:
Avec cette aide de méthode, le test devient vraiment simple.
la source
N'écrivez pas de test pour chaque membre - c'est beaucoup de travail
(peut-être que cette solution n'est pas parfaite pour toutes les situations - mais elle montre une solution possible. Vous devrez peut-être l'adapter à votre cas d'utilisation)
Il est possible d'utiliser la réflexion dans une bibliothèque pour tester si vos membres répondent tous correctement à l'événement de modification de votre propriété:
Le code suivant peut être utilisé comme bibliothèque et montre comment tester la classe générique suivante
Les tests de votre classe peuvent maintenant être écrits comme. (peut-être voulez-vous diviser le test en "événement est là" et "événement déclenché avec le nom correct" - vous pouvez le faire vous-même)
Classe
la source
J'ai fait une extension ici:
Il y a l'utilisation:
la source