如何在异步场景中测试Rx observable?

时间:2013-12-03 10:27:45

标签: c# asynchronous system.reactive reactive-programming observable

我已将问题分解为一个例子。 处理器执行异步操作并通过Rx observable发布结果。

public class Tests
{
    [Test]
    public async Task Receiving_an_async_result_should_succeed()
    {
        var p = new Processor();

        p.Process("message");

        var res = await p.Results;

        res.Should().NotBeNullOrEmpty();
    }
}

public class Processor
{
    private readonly ReplaySubject<string> _subject = new ReplaySubject<string>();

    public async void Process(string message)
    {
        try
        {
            // Fake some async processing here!
            var r = await Task.Factory.StartNew(() => message.Reverse().ToString());

            _subject.OnNext(r);
        }
        catch (Exception e)
        {
            _subject.OnError(e);
        }
    }

    public IObservable<string> Results { get { return _subject; } }
}

这里的问题是我不知道如何正确设置测试用例。似乎等待的结果永远不会到来!

1 个答案:

答案 0 :(得分:2)

结果是IObservable<T> - 因此,在发送OnCompleted()之前,结果尚未完成。这就是为什么你的等待没有回来。

我怀疑你想要等待第一个结果(看起来你打算反复调用Process) - 所以如果你改变这一行:

var res = await p.Results;

对此:

var res = await p.Results.Take(1);

你会有更多的运气。