[英]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.