Моя проблема: я хотел бы загрузить массив тестовых примеров data (не самих тестовых случаев), а затем запустить этот набор тестовых случаев.Все действия, загружающие данные и тестируемые методы, являются асинхронными.
//testData.js
module.exports.loadTestData() {
return new Promise(function(resolve, reject){
var testDataArr = [];
//do some async stuff and populate `testDataArr`
setTimeout(1000, function(){
testDataArr.push({
"message": "test description 1",
"data": "abcd" //data to pass to func
})
testDataArr.push({
"message": "test description 1",
"data": "abcd" //data to pass to func
})
resolve(testDataArr);
})
})
}
//myTests.test.js
const MyModule = require('../index.js');
const TestDataHelper = require('./testData');
const chai = require('chai');
const chaiAsPromised = require("chai-as-promised");
chai.use(chaiAsPromised);
const expect = chai.expect;
describe('#myTests', function(){
describe('#aFunction', function(){
describe('should fail', function(){
var failureCases;
before(async function(){
failureCases = await TestDataHelper.getTestData();
})
it('load test data', function(done){
//dummy test to cause the "before" to run and load test data
})
failureCases.forEach(function(case){
it(case.message, async function(){
await expect(MyModule.aFunction(case.data)).to.eventually.be.rejected;
})
})
})
})
})
Выше была моя последняя попытка заставить это работать (т.е. использование фиктивной функции, чтобы получить данные асинхронных тестов для загрузки доforEach
), но я все еще получаю следующую ошибку:
TypeError: Cannot read property 'forEach' of undefined
Это может быть очевидно, но у меня проблема с курицей или яйцом, и я не уверен, как ее решить.Поскольку describe
не поддерживает возвращаемые обещания , я не нашел способа асинхронной загрузки тестовых данных в массив, а затем зацикливания этого массива для динамической генерации тестовых случаев.
Некоторые другие обходные пути, которые я пробовал (включая использование флага --delay
):
// Попытка обходного пути # 1 (с использованием флага --delay)
var failureCases;
TestDataHelper.getTestData().then(function(arr){
failureCases = arr;
run();
})
describe('#myTests', function(){
describe('#aFunction', function(){
describe('should fail', function(){
failureCases.forEach(function(case){
it(case.message, async function(){
await expect(MyModule.aFunction(case.data)).to.eventually.be.rejected;
})
})
})
})
})
//mocha --delay still produces "Cannot read property 'forEach' of undefined" error
Попытка обходного пути# 2 (загрузка данных в асинхронном тестовом примере, а затем динамическое создание дополнительных данных)
describe('#myTests', function(){
describe('#aFunction', function(){
describe('should fail', function(){
it('load test data', async function(done){
var failureCases = await TestDataHelper.getTestData();
failureCases.forEach(function(case){
it(case.message, async function(){
await expect(MyModule.aFunction(case.data)).to.eventually.be.rejected;
})
})
})
})
})
})
В этом обходном пути mocha не выдает ошибку, но, похоже, фактически не запускает динамически сгенерированныйтесты, потому что я получаю только следующий вывод:
> mocha
#myTests
#aFunction
should fail
load test data ✓