javascript - 如何编写具有异步设置和拆卸操作的测试?

标签 javascript ajax unit-testing asynchronous qunit

我正在使用一个执行一些异步操作的库(pouchDB)。为了简单起见,我将保留细节,因为我认为这是涉及异步操作的“单元测试”的普遍问题(单元测试用引号引起来,因为我想如果我正在测试集成,这不是真正的单元测试与另一个库。但是,使用 QUnit 似乎是为其编写测试的最合适方法。

我正在使用 QUnit 进行 js 单元测试。我有两个测试。我发现如果我运行其中一个(同时将另一个注释掉),它们就会通过。如果我同时运行它们,第二个运行的运行将会失败。看起来第二个在第一个的拆卸完成之前正在运行,这会阻止第二个的设置成功完成。

module("pouchDB integration specs", {

  setup: function(){

   //some setup stuff
    }

  },

  teardown: function(){

   //some teardown stuff    
    });

  }

});

asyncTest("test1", 1, function(){

test1MethodBeingTested();

document.addEventListener("completedTest1Stuff", function(){

      deepEqual(newFriendSchedule, 'new', "Test 1 Looks Good'");
      start();

    });

  });


});

asyncTest("test2", 2, function(){

  stuffBeingTestedForTest2();

  document.addEventListener("test 2 stuff done", function(){

    deepEqual(expectedTest2Result, actualTest1Result, "test 2 looks good!");
    start();    

  })

});

(对垃圾缩进表示歉意。无论我如何努力,SO 的编辑都不喜欢我)

我查看了Martin Fowler's take on testing asynchronous code但我从中得出的结论是“你应该将代码设计为本质上不是异步的”。这没有帮助,因为我正在测试与我不想修改的库的集成(我也不认为我应该这样做 - 当然这个问题之前已经处理过?)

最佳答案

与测试方法类似,您可以在拆卸代码中使用 stopstart 来暂停测试运行程序,直到清理代码完成(asyncTest 隐式调用 stop)。 QUnit 对 stop/start 调用使用计数信号量,因此如果您有多个异步任务,您可以多次调用 stop

简单示例:

var teardownDone = false;
var tests = 0;

var testContent = function() {
    if (tests > 0) {
        QUnit.ok(teardownDone);
    } else {
        QUnit.ok(true);
        tests++;
    }
};

module('example', {
    teardown: function () {
        // Without this call and the subsequent start(), tests will fail.
        stop();
        setTimeout(function () {
            teardownDone = true;
            start();
        }, 1000);
    }
});

test('test1', testContent);
test('test2', testContent);

JSFiddle

关于javascript - 如何编写具有异步设置和拆卸操作的测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401474/

相关文章:

python - Django 休息框架 : Test serializers

java - 使用简单参数从单元测试调用主(spark)应用程序

javascript - JQuery 检查类是否匹配

javascript - 分析JS语法

javascript - 尝试从头开始使用 Javascript 创建一个 each() 类型的 jQuery 函数

javascript - React Gulpfile watchify 不更新

JSF 中未触发 ajax 事件

html - jQuery Mobile 不触发 pageinit

javascript - ajax PHP MySQL 查询

c# - 使用最小起订量验证某些方法的不同参数的多次调用