【问题标题】:How can I test Rx oberservable in async scenario?如何在异步场景中测试可观察的 Rx?
【发布时间】:2013-12-03 10:27:44
【问题描述】:

我已将问题分解为一个示例。 处理器执行异步操作并通过 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; } }
}

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

【问题讨论】:

  • Process 和 REsults 不相关,为什么您期望 PRocess 完成后,reuslts 也应该完成?

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


【解决方案1】:

结果是一个IObservable&lt;T&gt; - 因此在它发送一个OnCompleted() 之前它还没有完成。这就是您的 await 没有返回的原因。

我怀疑您只想等待第一个结果(看起来您打算反复致电Process)-因此,如果您更改此行:

var res = await p.Results;

到这里:

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

你会有更多的运气。

【讨论】:

  • 这就是我想要的。
  • 好东西,在当前版本的 Rx 中还引入了 FirstAsync(),其行为类似于 Take(1),只是它没有丑陋的幻数。不过我总是忘记它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
相关资源
最近更新 更多