我有一个用Polymer Dart编写的单页Web应用程序,现在是时候为其编写一些测试了(不是测试爱好者)。由于Selenium IDE / WebDriver不支持影子DOM,所以我用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>
开始起作用,它从服务器加载了一些JSON,根据JSON更改了位置栏中的标题和url,然后说将标题更改为“首页”,因为当JSON加载完成时不受dart的控制(它由Internet速度控制),因此有时测试会成功(JSON加载非常快),有时测试会失败(互联网速度低)。我的问题是,除了使用一些计时器等待之外,是否有办法告诉unittest在“正确的”时间运行测试?更好的是,可以在不触及
<my-app>
的代码(即将测试代码与应用程序逻辑分开)的情况下完成此操作吗?
最佳答案
因为我不知道<my-app>
的代码看起来如何,所以我不知道是否可以不进行修改。
IMHO最简单的方法是在完成JSON加载时在<my-app>
中触发一个事件,并在单元测试中监听此事件(请参阅How do I fire a custom event from Polymer Dart?),然后在事件处理程序中运行检查(expect(...)
)。
关于unit-testing - Polymer Dart Unittest:在HttpRequest.request()完成后运行test(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28042009/