我正在尝试解决一个单元测试问题。
我曾经有一个基本正常的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()。
发布于 2013-03-01 05:46:47
找到答案了。您可以将QUnit配置为不启动,然后在加载完所有测试后手动启动它。这可以防止重复调用Qunit.done,这是导致此问题的根本原因。
http://forum.jquery.com/topic/are-qunit-and-requirejs-compatible#14737000001967123
发布于 2013-03-01 04:03:51
这是完成此任务的一种方法--如果没有测试结果,则修改runner使其不退出。https://gist.github.com/SimpleAsCouldBe/5059623
但这并不起作用--每当清除测试堆栈时,Qunit.Done就会触发。在像Curl/Require.js这样的异步加载环境中,这种情况随时都可能发生。
发布于 2020-07-20 01:15:04
这是如果你不想使用require的话。例如,在浏览器上下文中可能。
我花了很长时间才找到一种方法,将脚本(和样式表)的加载转换为Promise(请参阅here),然后我发现QUnit测试套件在所有这些加载之前就开始运行存在很大问题。通常情况下,一开始有几个测试会抱怨某个变量或类未定义,尽管以后的测试不会有这样的困难。
您可以通过如下方式停止自动启动:
QUnit.config.autostart = false;..。似乎只需将其放入几个文件中的一个就足够了。
然后,要开始QUnit测试,您必须转到QUnit.start();。但是,可以理解的是,您不能从QUnit测试运行的任何代码中执行此操作。这就变得复杂了。最后,我在我的应用启动代码中做到了这一点:
await this.loadInjectedFile( GLOBAL_SCRIPT );
await this.loadInjectedFile( DBFORM_SCRIPT );
await this.loadInjectedFile( UDV_SCRIPT );
await this.loadInjectedFile( REACTIVITY_SCRIPT );
console.log( '... injected files loaded' );
// to allow QUnit to start testing
window.QUnitGreenLight = true;..。严格地说,这是一件不好做的事情(允许与测试相关的代码潜入你的应用程序代码)。或许可以找到一种更具区分性的方法。
然后,在启动测试的HTML文件中内联:
<script>
const tryToStartTesting = function(){
setTimeout( function(){
if( window.QUnitGreenLight ){
QUnit.start();
}
else {
console.log( 'QUnit green light not yet given!' );
tryToStartTesting();
};
}, 10 );
};
tryToStartTesting();
</script>..。实际上,在绿灯发出之前,似乎只需要几百分之一秒的时间。
可能有点争强好胜,但似乎很管用。
https://stackoverflow.com/questions/15142200
复制相似问题