在Dart中使用FakeAsync进行单元测试

时间:2020-03-05 16:00:14

标签: unit-testing asynchronous dart

我是单元测试的新手,我正在编写一个使用quiver package伪造异步执行的单元测试。我正在使用的功能看起来像这样:

import 'dart:async';

import 'package:quiver/testing/async.dart';
import 'package:rxdart/rxdart.dart';
import 'package:test/test.dart' as tester;

testStream<MyType>(
  String message, {
  Iterable expecting,
  Future<void> Function(BehaviorSubject) action,
  Duration waitTime,
  int skip = 1,
}) {
  tester.test(message, () {
    final _stream = BehaviorSubject<MyType>();
    FakeAsync().run((async) async {
      final List<MyType> _results = <MyType>[];
      final _subscription = _stream.skip(skip).listen(_results.add);
      await action?.call(_stream);

      if (waitTime != null) async.elapse(waitTime);

      _subscription.cancel();
      if (expecting != null) {
        tester.expect(_results, expecting);
      }
    });
  });
}

在我编写的大多数测试中,它都能很好地工作,但是由于缺乏知识,我在使用特定示例时遇到了问题。在特定情况下,我将通过类似以下操作的操作,该操作将延迟的未来添加到流中:

testStream<int>(
  'Just a basic message',
  expecting: [1],
  action: (stream) async =>
       Future.delayed(Duration(days: 99), () => stream.add(1)),
  waitTime: Duration(seconds: 1),
);

如果我理解正确,那么该测试应该会失败,但是当我运行它时,它会通过。 我在这里做什么错

然后,我该怎么做才能使其先执行该操作,然后在调用该操作后又等待定时器过去而不等待它?

0 个答案:

没有答案