簡體   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