聚合物飞镖单元测试:运行 test() when HttpRequest.request() 完成

Polymer dart unittest: run test() when HttpRequest.request() is complete

我有一个用 Polymer Dart 编写的单页 ​​Web 应用程序,现在是时候为它编写一些测试了(不是测试的粉丝)。由于SeleniumIDE/WebDriver不支持shadowDOM,我用dart的unittest包写的,像这样:

<!-- index.html (the single page app) -->
<title>My App</title>
<body>
  <my-app></my-app>
  <script type="application/dart" src="index_test.dart"></script>
</body>
// index_test.dart
import 'package:unittest/unittest.dart';
import 'dart:html';
import 'package:polymer/polymer.dart';

void main() {
  initPolymer().run(allTests);
}

void allTests() {
  test('First page should be "First Page"', () {
    expect(window.location.pathname, equals("/somepath"));
    expect(document.title, equals("First Page"));
  });

  test('Load Page 2', () {
    document
    .querySelector('my-app').shadowRoot
    .querySelector('paper-button')
    .click(); // load next page (without refresh)
    expect(document.title, equals("Second Page"));
  });
}

这个方法的问题是,当 index.html 被加载时,它的标题是 "My App",然后,<my-app> 开始工作,它加载一些 JSON 来自服务器,根据JSON更改地址栏中的标题和url,说它更改标题为"First Page",因为JSON何时加载完成不受控制dart,(它受网速控制),所以有时测试会成功,(JSON加载非常快),有时测试失败,(网速低)。

我的问题是,除了使用一些计时器等待之外,有没有办法告诉 unittest 在 "right" 时间 运行 进行测试?更好的是,是否可以在不触及 <my-app> 的代码的情况下完成,即将测试代码与应用程序逻辑分开?

因为不知道<my-app>的代码长什么样子,不修改不知道能不能。

恕我直言,最简单的方法是在加载 JSON 时在 <my-app> 中触发一个事件,并在单元测试中监听此事件(参见 How do I fire a custom event from Polymer Dart?),然后 运行 事件处理程序中的检查 (expect(...))。