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?