嵌套在 Node 中的循环.js与 Mocha 测试框架一起

Nested for loops in Node.js alongside Mocha test framework

本文关键字:Mocha 测试 框架 一起 js 循环 Node 嵌套      更新时间:2023-09-26

我在测试中需要嵌套的 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 都完成后,很容易调用函数。