Модульное тестирование события с использованием Reactive Extensions
я используюРеактивные расширения для .NET (Rx) выставлять события какIObservable<T>
, Я хочу создать модульный тест, в котором я утверждаю, что происходит определенное событие. Вот упрощенная версия класса, который я хочу протестировать:
public sealed class ClassUnderTest : IDisposable {
Subject<Unit> subject = new Subject<Unit>();
public IObservable<Unit> SomethingHappened {
get { return this.subject.AsObservable(); }
}
public void DoSomething() {
this.subject.OnNext(new Unit());
}
public void Dispose() {
this.subject.OnCompleted();
}
}
Очевидно, мои настоящие занятия более сложные. Моя цель - убедиться, что выполнение некоторых действий с тестируемым классом приводит к последовательности событий, сигнализируемой наIObservable
, К счастью, классы, которые я хочу протестировать, реализуютIDisposable
и звонитOnCompleted
на объекте, когда объект расположен намного проще для тестирования.
Вот как я тестирую:
// Arrange
var classUnderTest = new ClassUnderTest();
var eventFired = false;
classUnderTest.SomethingHappened.Subscribe(_ => eventFired = true);
// Act
classUnderTest.DoSomething();
// Assert
Assert.IsTrue(eventFired);
Использование переменной для определения, запускается ли событие, не так уж и плохо, но в более сложных сценариях я могу захотеть проверить, запускается ли определенная последовательность событий. Возможно ли это без простой записи событий в переменных и последующего выполнения утверждений для переменных? Возможность использовать свободный LINQ-подобный синтаксис, чтобы делать утверждения наIObservable
надеюсь, сделает тест более читабельным.