飞镖,如何用区域进行单元测试?

时间:2014-05-20 21:34:53

标签: unit-testing asynchronous dart

我想测试通过多个异步Stream发送事件的路径,我想测试的是通过Stream s发送无效参数我获得了特定类型的最后抛出的错误但是我不知道该怎么做,但是看了Zones看起来他们可能会提供一些希望,here是我的失败测试,​​运行测试只运行{{1文件。奇怪的是,在test/unit/start.dart中运行的复杂异步路径确实抛出了预期的错误类型,因此应该通过。为了对此进行测试,我尝试将测试更改为更简单的版本,如果您在失败的测试中复制以下代码中的粘贴,则此版本通过:

Zone

我无法弄清楚为什么正确的版本无法通过区域onError处理程序捕获其错误以及为什么简化版本可以正常工作。

1 个答案:

答案 0 :(得分:0)

解决这个问题的关键是要了解错误的来源,并且不是因为我的单元测试在区域中启动了最终导致错误抛出的复杂异步路径这一事实。 ,但构成复杂的异步路径的所有组件,如对象 / / 期货 /等都是提前创建的测试 setUp 方法,这似乎对特别重要。这项工作的关键是在 runZoned 体内的 setUp 方法中运行语句,并从那里处理错误,或者我可以使 setUp 方法在每个单元测试开始时显式调用的方法,因此我可以在 runZoned 主体中明确调用整个 setUp 方法。

无论哪种方式,作为我如何设法让它工作的代码示例,它可能是最具说明性的,以显示我用来解释它为什么不起作用的实验代码,尽管这基本上是我的库测试代码到底发生了什么:

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

void main(){

  test('This will fail', (){
    var error;

    Timer.run(expectAsync((){
      expect(error, equals('anError'));
    }));

    //create the stream and controller outside the zone
    var controller = new StreamController<String>();
    var stream = controller.stream.asBroadcastStream();
    stream.listen((_){ throw 'anError'; });

    runZoned((){
      //kick off the async pathway to throw the error
      controller.add('');
    }, onError: (e){
      error = e;
    });
  });


  test('This will pass', (){
    var error;

    Timer.run(expectAsync((){
      expect(error, equals('anError'));
    }));

    runZoned((){
      //create the stream and controller inside the zone
      var controller = new StreamController<String>();
      var stream = controller.stream.asBroadcastStream();
      stream.listen((_){ throw 'anError'; });
      //kick off the async pathway to throw the error
      controller.add('');
    }, onError: (e){
      error = e;
    });
  });

}