如何在 Dart 中测试异步 Stream

Posted

技术标签:

【中文标题】如何在 Dart 中测试异步 Stream【英文标题】:How to test asynchronous Stream in Dart 【发布时间】:2014-02-11 10:20:17 【问题描述】:

我有这样的简单课程

abstract class ServerConnection 
  Stream onMessage;
  Future send(Message m);
  ...

您使用消息调用发送,异步响应将流式传输到 onMessage。现在我需要通过这个连接发送各种消息和测试响应。我做了这个测试,但它不工作(我迷失了这些 expectAsynces)和 _waitForNextEvent 不是很好(但至少工作!)

test('connection', () 
  getCon().then((ServerConnection c) 

    Future<Message> _waitForNextEvent(Stream s) 
      StreamSubscription ss;
      Completer c = new Completer();
      ss = s.listen((Message m) 
        ss.cancel();
        c.complete(m);          
      );
      return c.future;
    

    _waitForNextEvent(c.onMessage).then(expectAsync1(
      (m) => expect(m, new isInstanceOf<OkMessage>('OkMessage'))
    ));
    c.send(new StatusMessage());

    _waitForNextEvent(c.onMessage).then(expectAsync1(
      (m) => expect(m, new isInstanceOf<PongMessage>('PongMessage'))
    ));
    c.send(new PingMessage());
  );
);

那么测试 Dart Streams 的正确和优雅的方法是什么?

【问题讨论】:

How to use `expectAsync2` correctly when writing dart unittest? 的可能重复项 看看引用的问题。如果它没有帮助添加评论。您需要注册一个您希望使用expectAsyncX() 调用的方法开始任何异步操作之前。 在最新的单元测试包 (0.10.0) 中,不推荐使用 expectAsync0/1/2 Changelog - unittest 0.10.0。似乎 0.10.0 有一个错误 Unittest 0.10.0 expectAsync Failure and other problems(只是为了让您知道,因为您可能会遇到它)。 我猜这个测试总是会中断,因为两个消息都会触发两个回调,例如发送PingMessage 并且测试将中断,因为假设PingMessage 不是子类OkMessage,第一个回调期待OkMessage。我想安全的方法是为每条不同的消息创建一个新流,但我可能错了。 【参考方案1】:

谢谢 Günter,异步测试必须在之前定义异步测试本身。不过,要测试更长的异步通信并不容易。

【讨论】:

很高兴你知道了。异步一开始有点困难,但你习惯了。

以上是关于如何在 Dart 中测试异步 Stream的主要内容,如果未能解决你的问题,请参考以下文章

Dart异步编程之Stream

Dart 语言异步编程之Stream

Dart中的Stream初步研究

Flutter状态管理——单Stream和广播Stream

Flutter状态管理——单Stream和广播Stream

Flutter状态管理——单Stream和广播Stream