我正在尝试使用QUnit测试一组javascript。我的代码如下所示:
module("A");
doExpensiveSetupForModuleA();
asyncTest("A.1", testA1);
asyncTest("A.2", testA3);
asyncTest("A.3", testA3);
module("B");
doExpensiveSetupForModuleB();
asyncTest("B.1", testB1);
asyncTest("B.2", testB3);
asyncTest("B.3", testB3);如果我按原样运行,那么在异步测试运行时doExpensiveSetupForModuleB()就会运行,从而导致失败。
如果doExpensiveSetupForModuleB()在testA*之前运行,那么这些测试要么失败,要么撤销昂贵的设置工作,从而导致testB*失败。
是否有办法在下一个模块上设置QUnit块?还是让它阻止启动一个新的测试,直到以前的异步测试完成?或者我应该使用更好的JS测试框架?
注意:我知道我的单元测试不是完全原子的。我确实有清理代码,这有助于确保我不会得到任何脏状态,但是doExpensiveSetupFor*()的开销太高了,因此在每次测试之前运行它是不现实的。
发布于 2013-05-02 23:09:38
你能用模块生命周期吗?
function runOnlyOnce(fn) {
return function () {
try {
if (!fn.executed) {
fn.apply(this, arguments);
}
} finally {
fn.executed = true;
}
}
}
// http://api.qunitjs.com/module/
module("B", {
setup: runOnlyOnce(doExpensiveSetupForModuleB)
});发布于 2013-05-09 22:00:45
这是一个从原始代码中改编的示例,它为每个测试方法执行安装方法:
function doExpensiveSetupForModuleA() {
console.log("setup A");
}
function testA1() {
console.log("testA1");
start();
}
function testA2() {
console.log("testA2");
start();
}
function testA3() {
console.log("testA3");
start();
}
function doExpensiveSetupForModuleB() {
console.log("setup B");
}
function testB1() {
console.log("testB1");
start();
}
function testB2() {
console.log("testB2");
start();
}
function testB3() {
console.log("testB3");
start();
}
QUnit.module("A", { setup: doExpensiveSetupForModuleA });
asyncTest("A.1", testA1);
asyncTest("A.2", testA2);
asyncTest("A.3", testA3);
QUnit.module("B", { setup: doExpensiveSetupForModuleB });
asyncTest("B.1", testB1);
asyncTest("B.2", testB2);
asyncTest("B.3", testB3);这将独立于执行测试的顺序,也不依赖于每个方法终止所花费的时间。
对start()的调用将确保只在方法的这一点上收集测试结果。
更详细的示例可以在QUnit Cookbook:http://qunitjs.com/cookbook/#asynchronous-callbacks中找到
更新:如果您不希望在每个测试方法之前执行昂贵的方法,但实际上每个模块只执行一次,只需在代码中添加控制变量,以检查模块是否已经设置:
var moduleAsetUp = false;
var moduleBsetUp = false;
function doExpensiveSetupForModuleA() {
if (!moduleAsetUp) {
console.log("setting up module A");
moduleAsetUp = true;
}
}
...
function doExpensiveSetupForModuleB() {
if (!moduleBsetUp) {
console.log("setting up module B");
moduleBsetUp = true;
}
}
...在此示例中,输出如下:
setting up module A
testA1
testA2
testA3
setting up module B
testB1
testB2
testB3 这样,您将使用昂贵的方法作为模块设置,而不是测试方法设置。
单元测试应该是原子的、独立的、孤立的,因此它们运行的顺序不应该相关。
Qunit并不总是按照相同的顺序运行测试,如果您希望您的测试按特定的顺序运行,您只需告诉QUnit不要重新排序:
QUnit.config.reorder = false;这样,您就可以确保testA在testB之前运行。
发布于 2014-05-23 15:39:47
我认为你对测试声明的工作方式有误解。
QUnit可以独立运行任何测试。使用test()或asyncTest()声明测试并不意味着QUnit将调用传入的函数。“重新运行”链接到每个测试旁边,重新加载页面,跳过除特定测试之外的每个测试。
因此,如果您想重新运行一个B模块测试,您的代码将设置A模块,即使它不需要。
其他人发布的模块设置解决方案很可能就是这里的方法。
https://stackoverflow.com/questions/16349104
复制相似问题