Я использую Reactive Extensions for .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
, мы надеемся сделать тест более удобочитаемым.
BTW, я думаю, что переменная отлично. Вышеприведенный код легко читается, что является самым важным. Ответ @ PL приятный и изящный, но вам нужно напрягаться, чтобы понять, что происходит ... Может быть, превратить его в расширение FailIfNothingHappened() –
@Sergey Aldoukhov: Я согласен, но ответ PL понял, как я могу использовать ' Материализуйте ', чтобы рассуждать о том, как ведет себя мой' IObservable'. И для более сложных тестов с использованием переменных для захвата того, что произошло, может быть труднее понять. Кроме того, создание расширения, как вы предлагаете, вероятно, облегчит понимание того, что происходит. –
Я отредактировал свой вопрос, чтобы сделать его более понятным, что я хочу. –