我正在尝试解决单元测试问题。
我曾经有一个大部分工作的 Maven -> PhantomJS -> Qunit 设置,但它是不可预测的,所以我把它拆开来尝试修复它。
我升级了软件:
Qunit: 1.11.0
PhantomJS: 1.8
Phantom Qunit Runner Latest: https://github.com/jquery/qunit/tree/master/addons/phantomjs
我看到 Web GUI 工作正常。它运行并通过了所有 102 项测试。控制台打印这个:
$ phantomjs --disk-cache=false runner.js http://localhost/ui/dcx/test.html
$ Took 16ms to run 0 tests. 0 passed, 0 failed.
如果我在运行程序中注释掉 exit 命令,它会多次打印 QUnit.done 的控制台输出。
$ phantomjs --disk-cache=false runner.js http://localhost/ui/dcx/test.html
$ PhantomJS successfully loaded a page
$ QUnit.done callback fired
$ Took 15ms to run 0 tests. 0 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1840ms to run 102 tests. 102 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1841ms to run 102 tests. 102 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1842ms to run 102 tests. 102 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1848ms to run 102 tests. 102 passed, 0 failed.
$ ^C
$
在我看来,Qunit.done 回调执行得太快了,然后执行了多次。
有人知道为什么回调会触发吗?
我的测试内容和登录延迟可能是相关的。我使用 AMD 模块来定义测试并使用 curl.js 来引入它们。在安全登录之前什么都不会发生:
curl(['dolla'], function($){
$.ajax({
type: 'POST',
url: '/svc/j_spring_security_check',
data: {
j_username: '7',
j_password: '7'
},
success: function() {
loadTests()
}
});
})
var loadTests = function () {
curl([
// Unit tests
'dcx/dataControls/activity.test'
, 'dcx/dataControls/eventList.test'
, 'dcx/dataControls/mapViewer.view.test'
, 'dcx/pages/deviceDetails.view.test'
, 'dcx/pages/login.test'
, 'dcx/pages/nodeProfiles.test'
, 'dcx/pages/settings.view.test'
], function() {}, function(ex) { throw new Error(ex) })
})
编辑:我认为,我认为这是根本原因。如果您在空白页上包含 QUnit,它会立即调用 QUnit.begin 和 QUnit.done。我需要延迟 Qunit 的执行,直到安全登录成功并且 curl 引入了我的单元测试。有没有办法延迟 QUnit 的启动,但仍然保持 Qunit 对象可用?我不能使用 stop(),因为有很多异步测试会调用 start()。