ScheduleOn и ObserveOn тестирование с перерывами FromEventPattern Observable? - PullRequest
0 голосов
/ 24 марта 2019

Я создал observable, используя Observable.FromEventPattern, и когда я тестирую его, он отлично работает.ЕСЛИ Я добавляю «SubscribeOn» или «ScheduleOn», используя какой-то планировщик.

Я воспользовался советом по тестированию с использованием TestSchedulers (http://introtorx.com/Content/v1.0.10621.0/16_TestingRx.html)

Интересно, даже если я создаю observable.FromEventPattern, используяScheduler.Default и выровняйте мои тесты с этим планировщиком, чтобы события не возникали.

Это ошибка в RxNet или я что-то упустил?

Я пытался убедиться, что всенаходится в том же планировщике, но мои тесты не работают при использовании «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) не изменит тест, но подписчик не увидит никаких событий.

...