我有一个用Polymer Dart编写的单页Web应用程序,现在是时候为它编写一些测试了,(不是测试的粉丝)。由于Selenium IDE / WebDriver不支持shadow 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的位置栏中,假设它将标题更改为“First Page”,因为当JSON加载完成时不受dart控制(它受互联网速度控制),因此有时测试会成功,(JSON加载真的很快),有时测试失败,(网速很低)。
我的问题是,有没有办法告诉unittest在“正确”的时间运行测试,除了使用一些计时器等待?更好的是,可以通过触摸<my-app>
的代码来完成,即从应用程序逻辑中分离测试代码吗?
答案 0 :(得分:1)
因为我不知道<my-app>
代码是什么样的,所以我无法判断它是否可以不加修改。
在加载JSON时,恕我直言在<my-app>
中触发事件的最简单方法是在单元测试中监听此事件(请参阅How do I fire a custom event from Polymer Dart?),然后运行检查(expect(...)
})在事件处理程序中。