Javascript 摩卡咖啡使用先前测试的数据
嗨,伙计们 我想用mocha按顺序执行这个测试用例。 这意味着将上一次测试的结果用于下一次测试。 但如何做到这一点呢Javascript 摩卡咖啡使用先前测试的数据,javascript,node.js,testing,mocha.js,Javascript,Node.js,Testing,Mocha.js,嗨,伙计们 我想用mocha按顺序执行这个测试用例。 这意味着将上一次测试的结果用于下一次测试。 但如何做到这一点呢 describe('some test', function(){ var x; it('do something', function(done){ x = [10, 20, 30]; done(); }); // dynamic test x.forEach(function(i){ it('test nu
describe('some test', function(){
var x;
it('do something', function(done){
x = [10, 20, 30];
done();
});
// dynamic test
x.forEach(function(i){
it('test number '+i, function(done){
setTimeout(function(){
done();
}, 500);
});
});
it('do something else', function(done){
done();
});
});
当前的问题是,forEach总是在分配x之前执行,这会引发无法准备属性“forEach”的未定义错误
这是我想要的输出:
some test:
- do something
- test number 1
- test number 2
- test number 3
- do something else
descripe()
块的主体始终立即执行。这允许创建动态测试(就像您正在尝试的那样),但也可以向Mocha注册所有测试部件
但是,正因为如此,实际测试的任何部分,如before()
块,都不能用于配置动态测试设置
取而代之的是,您可以直接使用它(我还冒昧地将for循环重写为可读性更强的内容,IMO):
但是,如果您打算在测试过程中以某种方式动态检索
x
,这也不会起作用,而且我也不确定是否可以基于作为测试一部分动态生成的值来创建动态测试。始终立即执行descripe()
块的主体。这允许创建动态测试(就像您正在尝试的那样),但也可以向Mocha注册所有测试部件
但是,正因为如此,实际测试的任何部分,如before()
块,都不能用于配置动态测试设置
取而代之的是,您可以直接使用它(我还冒昧地将for循环重写为可读性更强的内容,IMO):
但是,如果您打算在测试过程中以某种方式动态检索
x
,这也不会起作用,而且我不确定是否可以基于作为测试一部分动态生成的值创建动态测试。这不是您想要的答案,但我相信值得一提
你应该始终为独立测试而努力。测试相互依赖会给您带来不必要的问题
仅举几个例子;您必须以正确的顺序运行测试,并且您会发现当一个测试失败时,依赖于第一个测试的测试也会失败
看看这篇关于什么是好的单元测试的文章,这不是你想要的答案,但我相信它值得一提 你应该始终为独立测试而努力。测试相互依赖会给您带来不必要的问题 仅举几个例子;您必须以正确的顺序运行测试,并且您会发现当一个测试失败时,依赖于第一个测试的测试也会失败
看看这个关于什么是一个好的单元测试的例子,这可能是处理这个问题的正确方法。 使用run和delay选项(浏览器中的mocha.delay(),命令行中的-delay),允许mocha等待运行,直到您调用run()告诉它您已完成添加测试:
describe('using asynchronously acquired data', function(){
var x; // This is only needed if also using non-dynamically-generated tests on the same data.
getDataFromSomewhereAsynchronously(function(data){
x = data; // This is only needed if also using non-dynamically-generated tests on the same data.
data.forEach(function(dataItem, index){
it('dynamically generated test number ' + (index + 1), function(){
assert.whateverYouDoWithThisData(dataItem);
});
});
run();
});
it('non-dynamically-generated test using asynchronously acquired data', function() {
assert.whateverYouNeedToCheck(x);
});
});
谢谢@ScottFreeCode的回答
如果您的“x”数据是从测试本身检索的,那么上述解决方案将无法工作。因此,更好的解决方法是在一个唯一的it语句中完成所有工作(因此在it语句中使用循环)。但这样,我们可能必须处理超时问题(尤其是链式REST调用)。因此,最好将athis.timeout()线性增加
this.timeout(x.length * 1000); // 1 second per single-data
这可能是正确的处理方法。 使用run和delay选项(浏览器中的mocha.delay(),命令行中的-delay),允许mocha等待运行,直到您调用run()告诉它您已完成添加测试:
describe('using asynchronously acquired data', function(){
var x; // This is only needed if also using non-dynamically-generated tests on the same data.
getDataFromSomewhereAsynchronously(function(data){
x = data; // This is only needed if also using non-dynamically-generated tests on the same data.
data.forEach(function(dataItem, index){
it('dynamically generated test number ' + (index + 1), function(){
assert.whateverYouDoWithThisData(dataItem);
});
});
run();
});
it('non-dynamically-generated test using asynchronously acquired data', function() {
assert.whateverYouNeedToCheck(x);
});
});
谢谢@ScottFreeCode的回答
如果您的“x”数据是从测试本身检索的,那么上述解决方案将无法工作。因此,更好的解决方法是在一个唯一的it语句中完成所有工作(因此在it语句中使用循环)。但这样,我们可能必须处理超时问题(尤其是链式REST调用)。因此,最好将athis.timeout()线性增加
this.timeout(x.length * 1000); // 1 second per single-data
我更新了我的问题,是的,问题是x是动态检索的。对于您的代码,我仍然会有一个未定义错误的cannot ready属性'forEach'。
x
是否将是您需要检索的一次性值(换句话说,它是否独立于实际测试)?在这种情况下,可能有一个解决办法。否则,我认为您无法创建您想要的动态测试用例,您需要在单个it()
中测试x
的内容。x不是独立于实际测试的,它将通过REST调用进行检索。顺便说一句,我在这里也提出了一个问题:我认为这值得讨论……我更新了我的问题,是的,问题是x是动态检索的。对于您的代码,我仍然会有一个未定义错误的cannot ready属性'forEach'。x
是否将是您需要检索的一次性值(换句话说,它是否独立于实际测试)?在这种情况下,可能有一个解决办法。否则,我认为您无法创建您想要的动态测试用例,您需要在单个it()
中测试x
的内容。x不是独立于实际测试的,它将通过REST调用进行检索。顺便说一句,我在这里也提出了一个问题:我认为这值得讨论……很难用简短的评论来解释,但是,delay
会让摩卡等待run
启动套件,从而允许异步获取整个套件,Mocha仍然不允许异步生成出现在特定description
s中的it
。简单地说:it
s您生成的异步