【问题标题】:QUnit setup() called for each test before teardown在拆卸之前为每个测试调用 QUnit setup()
【发布时间】:2013-06-08 13:33:17
【问题描述】:

我将QUnitrequire.js 结合使用来对backbone.js 应用程序进行单元测试。所有测试都是异步的,使用asyncTest 方法。

我正在使用setupteardown 为每个测试构建和删除一个夹具。我的问题是,虽然asyncTest 似乎是阻塞的,但setup() 在每个测试开始之前都会被调用,几乎所有setup() 调用都会同时运行。 This solution 似乎无法解决我的问题。下面我有一个如何设置模块的示例,这里有一个指向test repository that illustrates the problem的链接

我的问题是:我做错了什么还是这个 QUnit 的正常行为?

module('Module', {
    setup: function(){
        console.log('setup');
    },
    teardown: function(){
        console.log('teardown');
    }
})

asyncTest('Test 1', function() {
    setTimeout(function(){
        equal(2, 2, 'The return should be 2.');
        start();
    }, 400);
});

asyncTest('Test 2', function() {
    setTimeout(function(){
        equal(1, 1, 'The return should be 1.');
        start();
    }, 400);
});

【问题讨论】:

  • 你应该看看Sinon。值得花一些时间学习它,对异步测试很有帮助。
  • @gustavohenke 你指的是 sinon 的哪一部分?我看过它,但只是因为它是嘲笑、存根、监视的东西。
  • 当你需要处理时间问题时,fake timers 很方便:)
  • 对了。为简洁起见,我使用 setTimeout 来代替我的 AJAX 回调。因此,恐怕替换 setTimeout 不是正确的解决方案。考虑到这一点,你有什么别的想法吗?
  • Sinon 还可以伪造 XMLHttpRequest 甚至是带有路由和自定义标头/状态码的完整服务器。您将永远不再需要信任您的服务器来测试 AJAX :)

标签: javascript unit-testing qunit


【解决方案1】:

QUnit 需要一个相当具体的页面加载行为。通过 requirejs 加载它可能看起来可行,但实际上并没有。建议通过常规脚本标签加载 QUnit。只要你设置QUnit.config.autostart = false,通过requirejs加载测试本身就可以了。

【讨论】:

  • 谢谢。这在某处有记录吗?
  • 如果是就好了!
  • 我在将 qUnit 与 requireJS 一起使用时遇到了同样的问题:我尽我所能,但似乎无法以这种方式加载它。使用脚本标签加载它并使用 requireJS 加载测试文件确实有效。请注意,必须在启动 QUnit 之前调用“QUnit.config.autostart = false”,因此将其放在使用 requireJS 加载的文件中是行不通的。
【解决方案2】:

包含解决方案的博文Jörn Zaefferer 指定above - http://www.jonnyreeves.co.uk/2012/qunit-and-requirejs/

这是我实现的-

我遇到的问题:

我通过 require 包含了 qunit。这似乎适用于所有同步测试。我在我的 qunit 模块的设置中定义了一个变量,并在拆卸时返回 null。当我包含一个 asyncTest 时,它似乎没有被拆解正确地重置,因此破坏了在那个期望一个新变量之后运行的所有测试。

关键点

  • 通过自己的脚本标签包含 qunit
  • 将自动启动设置为 false
  • 需要所有测试模块后重新开始

这可能不是最优雅的,但我也没有遇到任何端到端的例子,我花了几个小时才找到这个答案(因为我首先认为我的 asyncTest 设置不正确)。

<link rel="stylesheet" href="qunit-1.12.0.css">
<script type="text/javascript" src="qunit-1.12.0.js"></script>
<script>
    QUnit.config.autostart = false
    require(['App'],
    function(){

        //Modules that have been loaded in by require.js
        var loadedModules = [];

        //Locations of test modules to load
        var moduleLocations = [
            'tests/test1',
            'tests/test2',
            'tests/test3'
        ];

        //If all modules have been loaded, run them
        function runTests(){
            if (loadedModules.length == moduleLocations.length){
                QUnit.start();
                _.each(loadedModules,function(test){
                    test();
                });
            }
        }

        _.each(moduleLocations,function(string){
            require([string],
            function(a){
                loadedModules.push(a);
                runTests();
            });
        });

    });
</script>

单独的测试模块文件:

define(['array','of','test','requirements'], function() {

    return function(){

        var options = null;

        module('Autocomplete',{
            setup: function() {
                // prepare something for all following tests
                options = new whatever();
            },
            teardown: function() {
                // clean up after each test
                options = null;
            }
        });

        test( "normal tests", function() {
            ok(true,"normal assertions");
        });
    }
});

【讨论】:

    猜你喜欢
    • 2017-08-29
    • 2012-10-11
    • 1970-01-01
    • 2017-02-14
    • 2016-01-07
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多