Модульное тестирование события с использованием реактивных расширений

I ' m с помощью Reactive Extensions for .NET (Rx) , чтобы отображать события как IObservable . Я хочу создать модульный тест, в котором я утверждаю, что запускается определенное событие. Вот упрощенная версия класса, который я хочу протестировать:

public sealed class ClassUnderTest : IDisposable {

  Subject subject = new Subject();

  public IObservable 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 , мы надеемся, сделает тест более читабельным.

6
задан Martin Liversage 8 December 2011 в 12:19
поделиться