
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使得测试更加容易.
这是我测试的方式:
// Arrangevar classUnderTest = new ClassUndertest();var eventFired = false;classUnderTest.somethingHappened.Subscribe(_ => eventFired = true);// ActclassUnderTest.DoSomething();// AssertAssert.IsTrue(eventFired);
使用变量来确定事件是否被触发也不是太糟糕,但在更复杂的场景中,我可能想要验证是否触发了特定的事件序列.如果不简单地在变量中记录事件然后对变量进行断言,这是否可能?能够使用流畅的类liNQ语法在IObservable上进行断言有望使测试更具可读性.
解决方法 此答案已更新至现已发布的Rx版本1.0.官方文档仍然很少,但MSDN上的Testing and Debugging Observable Sequences是一个很好的起点.
测试类应该从Microsoft.Reactive.Testing命名空间中的ReactiveTest派生.该测试基于TestScheduler,为测试提供虚拟时间.
TestScheduler.Schedule方法可用于在虚拟时间内在某些点(滴答)排队活动.测试由TestScheduler.Start执行.这将返回ITestableObserver< T>例如,可以使用ReactiveAssert类来断言.
public class Fixture : ReactiveTest { public voID SomethingHappenedtest() { // Arrange var scheduler = new TestScheduler(); var classUnderTest = new ClassUndertest(); // Act scheduler.Schedule(TimeSpan.FromTicks(20),() => classUnderTest.DoSomething()); var actual = scheduler.Start( () => classUnderTest.somethingHappened,created: 0,subscribed: 10,disposed: 100 ); // Assert var expected = new[] { OnNext(20,new Unit()) }; ReactiveAssert.AreElementsEqual(expected,actual.Messages); }} TestScheduler.Schedule用于在时间20安排对DoSomething的调用(以滴答为单位).
然后TestScheduler.Start用于对可观察的SomethingHappened执行实际测试.订阅的生命周期由调用的参数控制(再次以刻度形式测量).
最后,ReactiveAssert.AreElementsEqual用于验证OnNext是否按预期在时间20调用.
测试验证调用DoSomething会立即触发可观察的SomethingHappened.
总结以上是内存溢出为你收集整理的c# – 使用Reactive Extensions对事件进行单元测试全部内容,希望文章能够帮你解决c# – 使用Reactive Extensions对事件进行单元测试所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)