У меня есть некоторый код, который вызывает PropertyChanged
события, и я хотел бы иметь возможность провести модульное тестирование, чтобы события вызывались правильно.
Код, который вызывает события, похож на
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");
}
}
}
}
Я получил хороший зеленый тест из следующего кода в моих модульных тестах, который использует делегаты:
[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);
}
Однако, если я тогда попытаюсь объединить настройки свойств вместе так:
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
MyOtherProperty = "SomeValue";
}
}
}
public string MyOtherProperty
{
set
{
if (_myOtherProperty != value)
{
_myOtherProperty = value;
NotifyPropertyChanged("MyOtherProperty");
}
}
}
Мой тест на событие не пройден - событие, которое он захватывает, является событием для MyOtherProperty.
Я почти уверен, что событие происходит, мой пользовательский интерфейс реагирует так же, как и он, но мой делегат фиксирует только последнее событие, которое сработало.
Итак, я задаюсь вопросом:
1. Правильный ли мой метод тестирования событий?
2. Является ли мой метод возбуждения цепочек событий правильным?
источник
Если вы делаете TDD, то тестирование событий может начать генерировать много повторяющегося кода. Я написал монитор событий, который позволяет гораздо чище подходить к написанию модульных тестов для этих ситуаций.
Пожалуйста, смотрите мой ответ на следующее для более подробной информации.
Модульное тестирование того, что событие вызывается в C # с использованием отражения
источник
Это очень старый и, вероятно, даже не будет читаться, но с некоторыми новыми классными функциями .net я создал класс INPC Tracer, который позволяет:
Смотрите суть: https://gist.github.com/Seikilos/6224204
источник
Ниже приведен слегка измененный код Эндрю, который вместо регистрации последовательности вызванных событий скорее подсчитывает, сколько раз было вызвано определенное событие. Хотя он основан на его коде, я считаю его более полезным в моих тестах.
источник
Основываясь на этой статье, я создал этот простой помощник утверждения:
С помощью этого вспомогательного метода тест становится действительно простым.
источник
Не пишите тест для каждого участника - это большая работа
(возможно, это решение не идеально подходит для любой ситуации - но оно показывает возможный путь. Возможно, вам придется адаптировать его для вашего случая использования)
Можно использовать отражение в библиотеке, чтобы проверить, все ли ваши участники правильно реагируют на событие изменения вашего свойства:
Следующий код может быть использован в качестве библиотеки и показывает, как протестировать следующий универсальный класс
Тесты вашего класса теперь могут быть записаны как. (возможно, вы хотите разделить тест на «событие есть» и «событие с правильным именем» - вы можете сделать это самостоятельно)
Класс
источник
Я сделал расширение здесь:
Есть использование:
источник