Einheitentest für ein Ereignis mit Reactive Extensions

Ich benutze Reaktive Erweiterungen für .NET (Rx), um Ereignisse als @ anzuzeigIObservable<T>. Ich möchte einen Komponententest erstellen, bei dem ich behaupte, dass ein bestimmtes Ereignis ausgelöst wird. Hier ist eine vereinfachte Version der Klasse, die ich testen möchte:

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();
  }

}

Offensichtlich sind meine wirklichen Klassen komplexer. Mein Ziel ist es, zu überprüfen, ob das Ausführen einiger Aktionen mit der getesteten Klasse zu einer Folge von Ereignissen führt, die auf dem @ -Zeichen angezeigt werdeIObservable. Zum Glück die Klassen die ich testen möchte implementierenIDisposable und anrufenOnCompleted auf das Subjekt, wenn das Objekt entsorgt wird, erleichtert das Testen erheblich.

Hier ist, wie ich teste:

// Arrange
var classUnderTest = new ClassUnderTest();
var eventFired = false;
classUnderTest.SomethingHappened.Subscribe(_ => eventFired = true);

// Act
classUnderTest.DoSomething();

// Assert
Assert.IsTrue(eventFired);

Die Verwendung einer Variablen, um festzustellen, ob ein Ereignis ausgelöst wurde, ist nicht allzu schlimm. In komplexeren Szenarien möchte ich jedoch möglicherweise überprüfen, ob eine bestimmte Folge von Ereignissen ausgelöst wurde. Ist das möglich, ohne einfach die Ereignisse in Variablen aufzuzeichnen und dann Aussagen über die Variablen zu treffen? In der Lage sein, eine flüssige LINQ-ähnliche Syntax zu verwenden, um Aussagen über ein @ zu treffIObservable würde den Test hoffentlich lesbarer machen.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage