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