Представьте себе простой стек обработки, в котором мы хотим, чтобы каждое входящее сообщение обрабатывалось в определенном SLA.Если это не так, мы хотим отправить ответ об ошибке отправителю.Должен быть отправлен только один ответ - успех или неудача, в зависимости от того, что наступит раньше.Моделирование это кажется простым.
public class RxTests : ReactiveTest
{
[Test]
public void TestSlowProcessing()
{
var scheduler = new TestScheduler();
var obs = scheduler.CreateHotObservable(OnNext(100, 1), OnNext(200, 2));
var processed = obs
// this is the main processing which may in some cases take a long time
/*
This code works as expected
.SelectMany(
val => val % 2 == 0 ? Observable.Never<int>() : Observable.Return(val));
*/
// this fails under test I guess because Sleep does not "yield" to the delayed observable and the main path processing ticks first
.Select(val =>
{
if (val % 2 == 0)
{
// how can I waste time here and let delayed observable tick?
scheduler.Sleep(10000);
}
return val;
});
var delayed = obs.Delay(TimeSpan.FromTicks(1000), scheduler);
var merged = processed.Merge(delayed).Distinct(_ => _);
var observer = scheduler.Start(() => merged, 0, 1, 1000000);
// We expect the second output message to come from the delayed feed.
Assert.IsTrue(observer.Messages[1].Time == 1200);
}
}
Реальный код использует Select, поскольку нам просто нужно преобразовать входящее сообщение, используя некоторые потенциально медленные вычисления.Но я не могу найти способ подражать этому замедлению в модульном тесте.Подожди, подожди и т. Д. Все будет в тупике.Есть идеи?