我正在使用一个执行一些异步操作的库(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但我从中得出的结论是“你应该将代码设计为本质上不是异步的”。这没有帮助,因为我正在测试与我不想修改的库的集成(我也不认为我应该这样做 - 当然这个问题之前已经处理过?)
最佳答案
与测试方法类似,您可以在拆卸代码中使用 stop
和 start
来暂停测试运行程序,直到清理代码完成(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);
关于javascript - 如何编写具有异步设置和拆卸操作的测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401474/