聚合物飞镖单元测试:运行 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(...)
)。
我有一个用 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(...)
)。