Mocha async загружает набор данных тестовых случаев, а затем динамически создает тестовые случаи - PullRequest
0 голосов
/ 03 июля 2019

Моя проблема: я хотел бы загрузить массив тестовых примеров 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 ✓

1 Ответ

0 голосов
/ 03 июля 2019

Разобрался.Использование --delay/run() будет работать, если используется правильно.«Описания» на самом деле должны выполняться в одном и том же блоке ПОСЛЕ завершения асинхронного метода.

Возвращаясь к моему «Попытке обойти # 1», он должен выглядеть следующим образом:


> mocha --delay

//myTests.test.js
TestDataHelper.getTestData().then(function(failureCases){

    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;
                    })
                })
            })
        })
    })

    run();
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...