【发布时间】:2019-11-14 04:52:46
【问题描述】:
我的问题:我想加载一组测试用例数据(不是测试用例本身),然后运行该组测试用例。所有操作,加载数据和正在测试的方法,都是异步的。
//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
这可能很明显,但我遇到了先有鸡还是先有蛋的问题,我不知道如何解决。因为describedoesn't support returned promises,所以我还没有找到一种方法,可以将测试数据异步加载到一个数组中,然后遍历该数组动态生成测试用例。
我尝试过的其他一些解决方法(包括使用--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 ✓
【问题讨论】:
标签: node.js asynchronous mocha.js