Mam kod, który wywołuje PropertyChanged
zdarzenia i chciałbym móc przetestować jednostkowo, czy zdarzenia są wywoływane poprawnie.
Kod, który wywołuje zdarzenia, jest podobny
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");
}
}
}
}
Otrzymuję ładny zielony test z następującego kodu w moich testach jednostkowych, który używa delegatów:
[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);
}
Jeśli jednak spróbuję połączyć ustawienia właściwości w następujący sposób:
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
MyOtherProperty = "SomeValue";
}
}
}
public string MyOtherProperty
{
set
{
if (_myOtherProperty != value)
{
_myOtherProperty = value;
NotifyPropertyChanged("MyOtherProperty");
}
}
}
Mój test na zdarzenie kończy się niepowodzeniem - zdarzenie, które przechwytuje, jest zdarzeniem dla MyOtherProperty.
Jestem prawie pewien, że zdarzenie się uruchamia, mój interfejs użytkownika reaguje tak, jak robi, ale mój delegat rejestruje tylko ostatnie zdarzenie do odpalenia.
Zastanawiam się więc:
1. Czy moja metoda testowania zdarzeń jest poprawna?
2. Czy moja metoda zgłaszania zdarzeń łańcuchowych jest poprawna?
źródło
Jeśli robisz TDD, testowanie zdarzeń może zacząć generować dużo powtarzalnego kodu. Napisałem monitor zdarzeń, który umożliwia znacznie czystsze podejście do pisania testów jednostkowych w takich sytuacjach.
Aby uzyskać więcej informacji, zobacz moją odpowiedź na poniższe pytania.
Testowanie jednostkowe, że zdarzenie jest zgłaszane w C # przy użyciu odbicia
źródło
To jest bardzo stare i prawdopodobnie nie będzie nawet czytane, ale dzięki kilku fajnym nowym funkcjom .net utworzyłem klasę INPC Tracer, która pozwala na:
Zobacz streszczenie: https://gist.github.com/Seikilos/6224204
źródło
Poniżej znajduje się nieco zmieniony kod Andrew, który zamiast rejestrować sekwencję zgłoszonych zdarzeń, liczy raczej, ile razy zostało wywołane określone zdarzenie. Chociaż jest oparty na jego kodzie, uważam, że jest bardziej przydatny w moich testach.
źródło
Na podstawie tego artykułu stworzyłem prostego pomocnika asercji:
Dzięki temu pomocnikowi metody test staje się naprawdę prosty.
źródło
Nie pisz testu dla każdego członka - to dużo pracy
(być może to rozwiązanie nie jest idealne w każdej sytuacji - ale pokazuje możliwy sposób. Może być konieczne dostosowanie go do swojego przypadku użycia)
Możesz użyć odbicia w bibliotece, aby sprawdzić, czy wszyscy członkowie poprawnie reagują na zdarzenie zmiany właściwości:
Poniższy kod może służyć jako biblioteka i pokazuje, jak przetestować następującą klasę ogólną
Testy Twojej klasy można teraz zapisać jako. (może chcesz podzielić test na „zdarzenie istnieje” i „zdarzenie wywołane z poprawną nazwą” - możesz to zrobić samodzielnie)
Klasa
źródło
Zrobiłem tutaj rozszerzenie:
Jest zastosowanie:
źródło