首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法延迟QUnit测试套件的启动?

有没有办法延迟QUnit测试套件的启动?
EN

Stack Overflow用户
提问于 2013-03-01 01:46:59
回答 3查看 1.5K关注 0票数 2

我正在尝试解决一个单元测试问题。

我曾经有一个基本正常的Maven -> PhantomJS -> Qunit设置,但它是不可预测的,所以我把它拆开,试图修复它。

我升级了软件:

代码语言:javascript
复制
Qunit: 1.11.0
PhantomJS: 1.8
Phantom Qunit Runner Latest: https://github.com/jquery/qunit/tree/master/addons/phantomjs

我看到web GUI正在工作。它运行并通过了所有102个测试。控制台将打印以下内容:

代码语言:javascript
复制
$ 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的控制台输出。

代码语言:javascript
复制
$ 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来引入测试。在安全登录执行以下操作之前,不会发生任何操作:

代码语言:javascript
复制
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()。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-01 05:46:47

找到答案了。您可以将QUnit配置为不启动,然后在加载完所有测试后手动启动它。这可以防止重复调用Qunit.done,这是导致此问题的根本原因。

http://forum.jquery.com/topic/are-qunit-and-requirejs-compatible#14737000001967123

票数 2
EN

Stack Overflow用户

发布于 2013-03-01 04:03:51

这是完成此任务的一种方法--如果没有测试结果,则修改runner使其不退出。https://gist.github.com/SimpleAsCouldBe/5059623

但这并不起作用--每当清除测试堆栈时,Qunit.Done就会触发。在像Curl/Require.js这样的异步加载环境中,这种情况随时都可能发生。

票数 0
EN

Stack Overflow用户

发布于 2020-07-20 01:15:04

这是如果你不想使用require的话。例如,在浏览器上下文中可能。

我花了很长时间才找到一种方法,将脚本(和样式表)的加载转换为Promise(请参阅here),然后我发现QUnit测试套件在所有这些加载之前就开始运行存在很大问题。通常情况下,一开始有几个测试会抱怨某个变量或类未定义,尽管以后的测试不会有这样的困难。

您可以通过如下方式停止自动启动:

代码语言:javascript
复制
QUnit.config.autostart = false;

..。似乎只需将其放入几个文件中的一个就足够了。

然后,要开始QUnit测试,您必须转到QUnit.start();。但是,可以理解的是,您不能从QUnit测试运行的任何代码中执行此操作。这就变得复杂了。最后,我在我的应用启动代码中做到了这一点:

代码语言:javascript
复制
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文件中内联:

代码语言:javascript
复制
<script>
    const tryToStartTesting = function(){
        setTimeout( function(){
            if( window.QUnitGreenLight ){
                QUnit.start();
            }
            else {
                console.log( 'QUnit green light not yet given!' );
                tryToStartTesting();
            };
        }, 10 );
    };
    tryToStartTesting();
</script>

..。实际上,在绿灯发出之前,似乎只需要几百分之一秒的时间。

可能有点争强好胜,但似乎很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15142200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档