我使用Observable.FromEventPattern创建了一个可观察对象,当我对其进行测试时,它的效果很好。除非我使用一些调度程序添加“ SubscribeOn”或“ ScheduleOn”。
我已经接受了使用TestSchedulers(http://introtorx.com/Content/v1.0.10621.0/16_TestingRx.html)进行测试的建议
有趣的是,即使我使用Scheduler.Default创建了observable.FromEventPattern。默认并将测试与该Scheduler对齐也不会引发事件。
这是RxNet中的bug还是我缺少什么?
我试图确保所有内容都在同一调度程序上,但是使用“ ScheduleOn”时,我的测试无法正常工作,除非我摆脱了所有subscribeOn和/或ObserveOn运算符。
可观察的设置代码如下: (请注意:“ scheduler.Default”可以添加到ctor中,但这无济于事!)
这是我的通用事件代码:
public class GenericEvent<T> : IDisposable
{
private event EventHandler<MyEventArg<T>> Event;
private IDisposable _internalSubscriber;
public IObservable<T> Events { get; }
public GenericEvent(ISchedulerProvider scheduler)
{
Events = Observable.FromEventPattern<MyEventArg<T>>(
handler => { Event += handler; },
handler => Event -= handler,
scheduler.Default)
.Select(e => e.EventArgs.Item);
// if we don't subscribe here operators that are between the observable and a subscription will not "hear" of event on the event stream
// until they actually subscribe to events
_internalSubscriber = Events.Subscribe((t) =>
{
// no-op
});
}
public void Raise(T item)
{
if (Event == null)
{
throw new Exception($"{this.GetType()} did not have its event handler started");
}
Event.Invoke(this, new MyEventArg<T>(item));
}
public void Dispose()
{
_internalSubscriber.Dispose();
}
}
这是测试:(注意:我将xunit和ITestOutputHelper用作_output对象。)
var s = new GenericEvent<string>();
s.Events
.Select(x=>x.ToUpper())
//don't add or test fails .SubscribeOn(schedulers.Default)
.Subscribe((i) =>
{
_output.WriteLine($"Got event {i}!");
});
schedulers.Default.Schedule(0, TimeSpan.Zero, (a, b) =>
{
s.Raise($"at time at time {a.Now.ToString()} Hello");
return null;
});
schedulers.Default.Schedule(0, TimeSpan.FromSeconds(10), (a, b) =>
{
s.Raise($" at time {a.Now.ToString()} GoodBye");
return null;
});
schedulers.Default.Start();
我期望的是添加SubscribeOn(schedulers.Default)不会更改测试,但是订户“看不到”任何事件。