2016-07-26 48 views
2

我正在嘗試使用for-loop動態生成測試,但要從異步任務中獲取要生成的測試的數量。這裏是我的代碼:在'描述'之前在摩卡中運行異步代碼

var noOfTestsToRun; 

before(function() { 
    return someAsyncTask().then(function(result) { 
     noOfTestsToRun = result; 
    }) 
}); 

describe('My Test Suite', function() { 
    for (var i = 0; i < noOfTestsToRun; i++) { 
     it('Test ' + i, function() { 
      //... 
     }); 
    } 
}); 

然而,noOfTestsToRun = result似乎並不當它到達for循環執行。

我想知道是否有解決這類問題的方法。謝謝。

+0

邁赫迪,上面的鏈接是有關運行的異步任務前所有的「它」,我的是關於「描述」 – batluck

+0

路易斯之前運行的異步任務,它的工作原理,非常感謝你。但是還有一個問題,如果我想要在另一個describe中的describe之前執行一些異步任務呢? – batluck

+0

先執行異步代碼,然後定義所有'mocha'的東西,比如'before','describe'和all。 – MarcoL

回答

0

done回調給您的before函數。

var noOfTestsToRun; 

before(function(done) { 
    return someAsyncTask().then(function(result) { 
     noOfTestsToRun = result; 

     // Complete the async stuff 
     done(); 
    }) 
}); 

describe('My Test Suite', function() { 
    for (var i = 0; i < noOfTestsToRun; i++) { 
     it('Test ' + i, function() { 
      //... 
     }); 
    } 
}); 

當你的異步任務完成並done()被調用時,我們告訴摩卡是異步的東西完成,它可以在移動的期望。

UPDATE

所以,你的目標是讓摩卡運行動態測試。

你可以通過一些破解來實現。您將需要一個it塊來強制執行before。在之前的版本中,您可以根據異步結果動態生成it測試。

before(function() { 
    return someAsyncTask().then(function(result) { 
     describe('My Test Suite (dynamic)', function() { 
      for (var i = 0; i < result; i++) { 
       it('Test ' + i, function() { 
        // ... 
       }); 
      } 
     }); 
    }); 
}); 

it('should force before to execute', function() { 
    console.log('Hack to force before to execute'); 
}); 

Working pen

+0

感謝您的快速回復。但它不起作用。 我用'Promise.resolve(1)'替換了'someAsyncTask()'並試用了你的解決方案。 'noOfTestsToRun'在到達'for'循環時仍未定義 – batluck

+1

試試這個http://stackoverflow.com/questions/22465431/how-can-i-dynamically-generate-test-cases-in-javascript-node – Prashant

+0

上面的解決方案爲'forEach'生成測試的常量值爲'['nl','fr','de']'。我需要一個異步任務的價值。它不能解決我的問題。 – batluck

相關問題