我正在使用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
进行断言,这样测试就会更易读。
Materialize
来理解我的IObservable
行为。对于更复杂的测试,使用变量来捕获发生的事情可能更难理解。此外,像您建议的创建扩展可能会更容易理解正在发生什么。 - Martin Liversage