4

这是我在尝试对流进行单元测试时遇到的问题的一个非常简化的版本。

测试检查是否已将正确的事件添加到流中 - 它似乎工作正常 - 例如,将值更改add( 'test')add( 'test2')将使测试失败。

但是当您注释掉该行fireKeepAliveMessage(message);以便事件不会抛出时,单元测试将永远运行。

如何在测试中添加某种超时?或者有没有更好的方法来解决这个问题?

library stream_test;

import "package:unittest/unittest.dart";
import "dart:async";

void main() {
   test("aa", () {
   StreamController streamController = new StreamController();

   streamController.add( "test");
   Stream underTest = streamController.stream;

   underTest.first.then(expectAsync((e){
        expect( e, equals( "test"));
   })); 
 });
}
4

2 回答 2

3

我会这样做:

library stream_test;

import "package:unittest/unittest.dart";
import "dart:async";

void main() {
  test("aa", () {
    StreamController streamController = new StreamController();

    Timer t;

    Stream underTest = streamController.stream;
    underTest.first.then(expectAsync((e) {
      expect(e, equals("test"));
      if (t != null) {
        t.cancel();
      }
    }));

    t = new Timer(new Duration(seconds: 3), () {
      fail('event not fired in time');
    });

    streamController.add("test");
  });
}
于 2014-06-04T05:44:34.170 回答
0

Stream 类对此有方法。

 Stream timeout(Duration timeLimit, {Function void onTimeout(EventSinksink)})

使用与此流相同的事件创建一个新流。

每当来自此流的两个事件之间传递的时间超过 timeLimit 时,就会调用 onTimeout 函数。

在收听返回的流之前,倒计时不会开始。每次从该流转发事件或当流暂停和恢复时,都会重置倒计时。

onTimeout 函数使用一个参数调用:dart-async.EventSink,它允许将事件放入返回的流中。此 EventSink 仅在调用 onTimeout 期间有效。

如果省略 onTimeout,超时只会将 dart-async.TimeoutException 放入返回流的错误通道中。

返回的流不是广播流,即使此流是。

于 2014-06-04T04:21:19.020 回答