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

时间:2013-02-28 17:46:59

标签: unit-testing maven phantomjs qunit

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

我曾经有一个主要工作的Maven - > PhantomJS - > Qunit设置,但它是不可预测的,所以我把它拆开试图解决它。

我升级了软件:

Qunit: 1.11.0
PhantomJS: 1.8
Phantom Qunit Runner Latest: https://github.com/jquery/qunit/tree/master/addons/phantomjs

我看到网页GUI工作正常。它运行并通过所有102个测试。控制台打印出这个:

$ phantomjs --disk-cache=false runner.js http://localhost/ui/dcx/test.html
$ Took 16ms to run 0 tests. 0 passed, 0 failed.

如果我在跑步者中注释掉退出命令,它会多次打印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()。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

这是一种方法 - 如果没有测试结果,修改跑步者不退出。 https://gist.github.com/SimpleAsCouldBe/5059623

这不起作用 - 只要清除测试堆栈,Qunit.done就会触发。在像Curl / Require.js这样的异步加载环境中,这可能随时发生。

答案 2 :(得分:0)

这是如果您不想使用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>

...实际上,绿灯发出可能要花几分之一秒的时间。

也许有点草率,但这似乎可行。