嵌套在 Node 中的循环.js与 Mocha 测试框架一起
Nested for loops in Node.js alongside Mocha test framework
我在测试中需要嵌套的 for 循环,但我迷失了整个异步方面的事情。基本上现在发生的事情是我想遍历一个数组,并逐个使用值并记录输出。目前发生的事情是,唯一记录的输出是我想要使用的最后一个值的输出。这很难解释,所以我将演示我的代码。
// For the sake of it, all these values are strings
var arr1 = [ [1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 2, 1], [4, 1, 2, 3] ];
var arr2 = [ [a, b, c, d], [b, c, d, a], [c, d, a, b], [d, a, b, c] ];
for(var i = 0; i < arr1.length; i++){
describe("Test", function(){
it("Does something", function(done){
for(var x = 0; x < arr2.length; x++){
it("Does something else", function(done){
// Do stuff with arr1[i], arr2[x] etc.
testFunc(arr1[i], arr2[x], function(returnValue){
assert.strictEqual(returnValue, true, "Passed!");
done();
}
});
}
});
});
}
现在,我无法填写代码的实际作用(隐私原因(,但如果有人可以指出我可以做到这一点的方法(这意味着循环每次都等待来自testFunc()
的回调(。
如果我们说testFunc()
如下:
function testFunc(arr1var, arr2var, callback){
console.log(arr1var + " and " + arr2var);
}
当我运行它时,我看到的只是传递给控制台的最终值('3 和 c'(。
我一直在寻找这个,但由于人们的示例非常特定于他们的代码,因此尝试和适应是令人困惑的。我查看了 Node.js Async
模块,但也没有走得很远。
如果有人可以一步一步地告诉我,或者重写上述内容以按照我想要的方式工作,我将不胜感激。
此外,在我的实际代码中,我的数组在顶部的大小不同 - 以防万一导致差异。
既然有几个人已经指出了,我只想补充一点,如果有人有更好的方法,我完全愿意接受建议。我将运行 ~40 个测试,这会将其减少到 10-15 行代码,而不是单独调用每个代码的 200 行,所以无论人们认为什么是最好的,请随时建议我。
我在你的例子中没有看到任何代码异味。你只需要使用 async.each 而不是你的 for 循环。另外,我不明白为什么你需要两个 it 语句。相反,我会做这样的事情:
var async = require('async');
var expect = require('expect.js');
var _ = require('lodash');
var arr1 = [ [1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 2, 1], [4, 1, 2, 3] ];
var arr2 = [ [1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 2, 1], [4, 2, 2, 3] ];
describe('Array tests', function() {
async.each(arr1, function(arr1Element, callback) {
async.each(arr2, function(arr2Element, callback2) {
it('Tests array elements', function(done) {
expect(_.difference(arr1Element, arr2Element)).to.be.empty();
done();
});
callback2();
});
callback();
});
});
的第一个异步测试检查将调用done((并告诉摩卡整个测试已经完成。您需要使用代码进行 done(( 调用,该代码计算已完成的测试数量,然后在最后一次完成后完成调用。
for(var i = 0; i < arr1.length; i++){
describe("Test", function(){
it("Does something", function(done){
var remaining = arr2.length;
for(var x = 0; x < arr2.length; x++){
it("Does something else", function(done){
// Do stuff with arr1[i], arr2[x] etc.
testFunc(arr1[i], arr2[x], function(returnValue){
assert.strictEqual(returnValue, true, "Passed!");
remaining--;
if (remaining === 0) {
done();
}
}
});
}
});
});
}
也就是说,我不知道摩卡是否支持多个同时进行的 it(( 调用。您可能需要在 it(( 中移动两个循环。
对我来说,在不同的点而不是彼此相邻的 for 循环似乎很奇怪,但这可能只是您正在测试的结果。
更好的方法是切换到使用 promise 而不是异步回调,因为 promise 可以很容易地聚合,即当集合中的所有 promise 都完成后,很容易调用函数。
- 当我尝试运行mocha测试时,没有定义Worker
- Mocking console.log()/MOCHA测试框架中的任何其他函数
- 用mocha测试异步函数
- Mocha测试框架的test.describe返回值
- 使用节点调试器调试ES6 Mocha测试
- Mocha测试套件因未捕获的异常而暂停
- Javascript Mocha测试-测试函数表达式中的函数表达式
- 编写Karma+Mocha测试,同时使用依赖注入和“完成”
- 用物体构造Mocha测试
- 如何在启动Mocha测试用例之前添加延迟
- 用mocha测试异步瀑布似乎停滞不前
- Mocha测试MongoDB:在多次测试中出现未捕获的TypeError
- 如何在mocha测试中模拟全局变量(define、module、window)
- 将 HTML 报告与 Mocha 测试框架结合使用
- 使用 Mocha 测试 JavaScript - 如何使用 console.log 来调试测试
- 嵌套在 Node 中的循环.js与 Mocha 测试框架一起
- 如何使用 Mocha 测试“正常”(非节点特定)JavaScript 函数
- Mocha测试未访问全局变量
- Mongoose mongodb保存子文档混乱?Mocha测试没有完成()
- Mocha测试在本地通过,但在Travis CI上失败