繁体   English   中英

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

[英]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()并告诉mocha整个测试已经完成。 您需要使用对已完成多少测试进行计数的代码进行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();
                        }
                    }
                });
            }
        });
    });
}

也就是说,我不知道mocha是否支持多个同时的it()调用。 您可能需要在it()中移动两个循环。

在您看来,for循环在不同的点而不是彼此相邻,这对我来说似乎很奇怪,但这可能只是您正在测试的结果。

更好的方法是切换到使用Promise而不是异步回调,因为Promise可以很容易地聚合,即,当集合中的所有Promise完成时,很容易调用函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM