Dart - 流事件超时的单元测试

时间:2014-06-04 02:39:47

标签: dart dart-async dart-unittest

这是我在尝试单元测试流时遇到的问题的简化版本。

测试检查是否已将正确的事件添加到流中 - 它似乎工作正常 - 例如,将值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"));
   })); 
 });
}

2 个答案:

答案 0 :(得分:1)

我会这样做:

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");
  });
}

答案 1 :(得分:0)

Stream类有这个方法。

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

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

     

每当超过timeLimit从两个事件之间传递时   stream,调用onTimeout函数。

     

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

     

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

     

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

     

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