ScheduleOn和ObserveOn中断测试FromEventPattern是否可观察?

时间:2019-03-24 00:14:06

标签: system.reactive

我使用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)不会更改测试,但是订户“看不到”任何事件。

0 个答案:

没有答案