Модульное тестирование последовательности приема, где один из потоков задерживается, а другой может включать медленную работу - PullRequest
1 голос
/ 07 марта 2019

Представьте себе простой стек обработки, в котором мы хотим, чтобы каждое входящее сообщение обрабатывалось в определенном 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, поскольку нам просто нужно преобразовать входящее сообщение, используя некоторые потенциально медленные вычисления.Но я не могу найти способ подражать этому замедлению в модульном тесте.Подожди, подожди и т. Д. Все будет в тупике.Есть идеи?

...