Les tests unitaires que les événements sont déclenchés en C# (dans l'ordre)
J'ai un code qui pose PropertyChanged
événements et je voudrais être en mesure de test de l'unité que les événements sont élevés correctement.
Le code qui est d'élever les événements, c'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");
}
}
}
}
Je reçois un joli vert d'essai à 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 je puis essayer de la chaîne et le réglage des propriétés de l'ensemble comme suit:
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 le cas d'échec - l'événement qu'il capture est le cas pour la MyOtherProperty.
Je suis sûr que l'événement se déclenche, mon INTERFACE réagit comme il le fait, mais mon délégué ne retient que le dernier événement à feu.
Alors je me demandais:
1. Est ma méthode de dépistage correct?
2. Est ma méthode de collecte de enchaîné événements correct?
Vous devez vous connecter pour publier un commentaire.
Tout ce que vous avez fait est correct, offrant vous voulez que votre test de demander "Quel est le dernier événement qui a été soulevé?"
Votre code est de mettre le feu à ces deux événements, dans cet ordre
Si c'est "correct" ou non dépend du but de ces événements.
Si vous voulez tester le nombre d'événements qui obtient augmenté, et l'ordre qu'ils sont très élevés, vous pouvez facilement étendre votre test:
Si vous êtes en train de faire TDD événement tests peuvent commencer à générer un beaucoup de code répétitif. J'ai écrit un moniteur d'événement qui permet à un beaucoup plus propre approche de test de l'unité de l'écriture de ces situations.
Veuillez voir ma réponse à la suite pour plus de détails.
Les tests unitaires qu'un événement est déclenché en C#, à l'aide de la réflexion
C'est très ancienne, et probablement l'habitude même de lire mais avec de la fraîcheur de la nouvelle .net caractéristiques que j'ai créé un INPC Traceur classe qui permet de:
Voir résumé: https://gist.github.com/Seikilos/6224204
Ci-dessous est légèrement modifié André code qui, au lieu de simplement la journalisation de la séquence des événements déclenchés plutôt de compter combien de fois un événement spécifique a été appelé. Bien qu'il soit basé sur son code, je le trouve plus utile dans mes tests.
Fondées sur le présent article, j'ai créé cette simple affirmation helper :
Avec cette méthode helper, le test devient très simple.
Ne pas écrire un test pour chaque membre - c'est beaucoup de travail
(peut-être que cette solution n'est pas parfaite pour chaque situation - mais il montre une voie possible. Vous pourriez avoir besoin pour l'adapter à votre cas d'utilisation)
Il est possible d'utiliser la réflexion dans une bibliothèque afin de tester si les membres sont tous de répondre à votre propriété a changé de cas correctement:
Le code suivant peut être utilisé comme une bibliothèque et montre comment tester le générique suivante classe
Les tests de votre classe peut maintenant être écrite. (peut-être que vous souhaitez diviser le test en "événement" et "événement a permis d'amasser avec le nom correct" - vous pouvez le faire vous-même)
Classe
J'ai fait une extension ici:
Il y a l'utilisation: