我似乎遇到了使用TestScheduler和Observable.FromEventPattern的特定设置的问题观察。似乎正在发生的事情是,这些事件都被解雇了,但我只观察了第二个事件发生后的第一个事件。当然,我可以在这里完成一些愚蠢的事情,而我只是看不到我做错了什么。此外,我可能已经完全错过一个点或欺骗:-)当使用TestScheduler将事件触发到具有ObserveOn的Observable.FromEventPattern中时,直到下一个事件被触发时,事件才被观察到
有人能向我解释什么,我缺少知识或我在做什么错,只看到1个事件,如果我通过2推进?
我已经阅读了我的大部分对李坎贝尔http://www.introtorx.com/信息(这是我发现的知识:-)的一个极好的喷泉)
我使用:
起订量V4.2.1409.1722
的Rx V 2.2.5.0
的xUnit V 1.9.2.1705
这是我的代码。 只是我自己的事件参数,所以我可以看到正在观察的数据。
public class MyEventArgs : EventArgs
{
public int Data { get; private set; }
public MyEventArgs(int data)
{
Data = data;
}
}
与将被模拟的EventHandler的接口。
具有观察者,并且监控来自传入的TMP对象的事件的类,它也需要一个调度器,所以我可以测试该观察者。
internal class SomeClass2
{
private IObservable<EventPattern<MyEventArgs>> _observable;
public SomeClass2(ITmp tmp, IScheduler scheduler)
{
_observable = Observable.FromEventPattern<MyEventArgs>(h => tmp.tmpEvent += h, h => tmp.tmpEvent -= h)
.Do(next => Console.WriteLine("Item came in...{0}", next.EventArgs.Data))
.ObserveOn(scheduler);
}
public IObservable<EventPattern<MyEventArgs>> Raw()
{
return _observable;
}
}
该测试。
public class Tests
{
[Fact]
public void FactMethodName2()
{
var mockedTmp = new Mock<ITmp>();
var testScheduler = new TestScheduler();
var temp = new SomeClass2(mockedTmp.Object, testScheduler);
var count = 0;
var myEventArgsObserved = new List<MyEventArgs>();
temp.Raw().Subscribe(
next =>
{
count++;
myEventArgsObserved.Add(next.EventArgs);
});
testScheduler.Schedule(TimeSpan.FromTicks(1),() => mockedTmp.Raise(tmp => tmp.tmpEvent += null, new MyEventArgs(1)));
testScheduler.Schedule(TimeSpan.FromTicks(2),() => mockedTmp.Raise(tmp => tmp.tmpEvent += null, new MyEventArgs(2)));
testScheduler.AdvanceBy(1);
testScheduler.AdvanceBy(1);
Assert.Equal(2, count);
}
}
控制台输出:
项目进来了...... 1
项目进来了...因为它只有在这一点上观察到1个事件2
断言失败。我已经完成了这一步,并观察到第一个事件直到第二个事件发射时才被观察到。
作为一个方面说明,如果我添加另一个AdvanceBy(1)或者如果我使用testScheduler.Start而不是AdvanceBy's,或者如果删除ObserveOn并将调度程序传递到FromEventPattern中,此测试将工作。
如果我想找到你回答我的信息,我是否需要深入研究rx代码?你是如何学习这些信息的? :-)由于我似乎没有找到足够的资源在线,除了introtorx。我对rx也有点新鲜感。我知道它说不写评论说感谢,但我觉得答案和投票是不够的。如果人们不喜欢它,并且我愿意,我可以稍后删除此评论。但是非常感谢你,这是一个非常好的答案,非常清楚,很好的解释,并且给我展示了一种更加美观的测试方式,给了我更多的理解! – RichardWilliams 2014-10-17 18:34:46
很高兴它有帮助。至于我在哪里以及如何来到这里,这里真的没有简单的答案 - 很多地方。 Rx团队博客是一个很好的来源 - 尤其是在测试方面。请参阅[本文](http://blogs.msdn.com/b/rxteam/archive/2012/06/14/testing-rx-queries-using-virtual-time-scheduling.aspx)。我还读了Rx的介绍(干杯李!),我研究了源代码,观看了第9频道的许多视频。我也很幸运能够广泛使用Rx开展商业项目。我还回答了许多关于SO的Rx问题。所以真的是来自许多来源的经验。 – 2014-10-17 22:56:32