量角器之外的打字稿和异步初始化
Typescript and async initialisation outside protractor it
我使用 csv-parser
从 CSV
文件中读取了一个测试配置,它的行为是异步的。当我将解析器包装在一个 Promise 中并在我的异步 it
测试用例中使用它时 await 配置数据被解析......在 'it' 之外它不是已解决,因为 describe 不支持 async
并且 module: commonjs
不允许顶级 await。
配置数据包含测试数据,用于 运行 在具有不同参数的循环中的 'it' 测试用例上。
所以我需要一种方法:
- 解决 'it' 之外的承诺以获取配置数据或
- 找到一种方法来等待
csv-parser
stream/pipe/on 在返回配置数据之前完成。
export function initCountryMatrixFromCsv() {
return new Promise <Map<string, ShopFunction>>((resolve, reject) => {
const countryShopFunctions = new Map<string, ShopFunction>();
countryShopFunctions.set(ALL_FUNCTIONS, new Map<string, ShopFunction>());
const fs = require('fs');
const csv = require('csv-parser');
const parsedCsv = [];
// behaves async... returns imediately and without the promise countryShopFunctions map is not filled:
fs.createReadStream(__dirname + '/country_matrix.csv')
.pipe(csv({ separator: ',' }))
.on('headers', async (headers) => {
// some header inits
}
)
.on('data', async (data) => await parsedCsv.push(data))
.on('end', async () => {
// init configuration in countryShopFunctions
});
});
describe('E2E-I18N-CMX: test country matrix', () => {
// a promise... await not alowed here
const matrix = initCountryMatrixFromCsv();
// not possible since matrix is a promise
matrix.forEach((shopFunction, roleName) = > {
it('Test ' + role, async (){
// perform test with shopFunction params
// first place to resolve the promise ... but i need it outside the it
const matrix2 = await initCountryMatrixFromCsv();
});
});
});
我尝试了几种有和没有 promise 的变体,但当我不将 Promise 与 await 一起使用时,所有变体都以空映射结束。
将初始化函数放在 beforeAll/beforeEach 块中。然后矩阵在每个 it
中可用
describe('your test', () => {
let matrix2;
beforeAll(async () => {
matrix2 = await initCountryMatrixFromCsv();
});
it('my test', () => {
expect(matrix2).toBeTruthy(); // do more verifications ...
});
});
还要确保 resolve
函数中的承诺。我想你希望它在 on('end')
中解决
我假设您将 Protractor 与 Jasmine 一起使用(尽管这并不重要)。
Jasmine 将尝试在解决您的实际 initCountryMatrixFromCsv
方法之前解决测试用例。
这背后的原因很简单,它需要知道有多少测试作为其设置的一部分。
我 运行 在我们的测试中遇到了同样的问题,解决方法是读取 CSV 文件同步。
为此,我使用了 csv-load-sync npm 包,然后阅读文件:
import * as fs from 'fs';
import * as loader from 'csv-load-sync';
import * as path from 'path';
readTestDataCsvSync() {
const filePath = path.join(__dirname, 'TestData.csv');
try {
if (fs.existsSync(filePath)) {
return loader(path.join(__dirname, 'TestData.csv'));
}
}
catch (err) {
throw new Error(`Couldn't load the test cases CSV file: ${err}`);
}
}
现在您可以像以前一样进行测试了:
describe('E2E-I18N-CMX: test country matrix', () => {
const matrix = readTestDataCsvSync();
matrix.forEach((shopFunction, roleName) = > {
it('Test ' + role, async (){
// your test
});
});
});
我使用 csv-parser
从 CSV
文件中读取了一个测试配置,它的行为是异步的。当我将解析器包装在一个 Promise 中并在我的异步 it
测试用例中使用它时 await 配置数据被解析......在 'it' 之外它不是已解决,因为 describe 不支持 async
并且 module: commonjs
不允许顶级 await。
配置数据包含测试数据,用于 运行 在具有不同参数的循环中的 'it' 测试用例上。
所以我需要一种方法:
- 解决 'it' 之外的承诺以获取配置数据或
- 找到一种方法来等待
csv-parser
stream/pipe/on 在返回配置数据之前完成。
export function initCountryMatrixFromCsv() {
return new Promise <Map<string, ShopFunction>>((resolve, reject) => {
const countryShopFunctions = new Map<string, ShopFunction>();
countryShopFunctions.set(ALL_FUNCTIONS, new Map<string, ShopFunction>());
const fs = require('fs');
const csv = require('csv-parser');
const parsedCsv = [];
// behaves async... returns imediately and without the promise countryShopFunctions map is not filled:
fs.createReadStream(__dirname + '/country_matrix.csv')
.pipe(csv({ separator: ',' }))
.on('headers', async (headers) => {
// some header inits
}
)
.on('data', async (data) => await parsedCsv.push(data))
.on('end', async () => {
// init configuration in countryShopFunctions
});
});
describe('E2E-I18N-CMX: test country matrix', () => {
// a promise... await not alowed here
const matrix = initCountryMatrixFromCsv();
// not possible since matrix is a promise
matrix.forEach((shopFunction, roleName) = > {
it('Test ' + role, async (){
// perform test with shopFunction params
// first place to resolve the promise ... but i need it outside the it
const matrix2 = await initCountryMatrixFromCsv();
});
});
});
我尝试了几种有和没有 promise 的变体,但当我不将 Promise 与 await 一起使用时,所有变体都以空映射结束。
将初始化函数放在 beforeAll/beforeEach 块中。然后矩阵在每个 it
中可用describe('your test', () => {
let matrix2;
beforeAll(async () => {
matrix2 = await initCountryMatrixFromCsv();
});
it('my test', () => {
expect(matrix2).toBeTruthy(); // do more verifications ...
});
});
还要确保 resolve
函数中的承诺。我想你希望它在 on('end')
我假设您将 Protractor 与 Jasmine 一起使用(尽管这并不重要)。
Jasmine 将尝试在解决您的实际 initCountryMatrixFromCsv
方法之前解决测试用例。
这背后的原因很简单,它需要知道有多少测试作为其设置的一部分。
我 运行 在我们的测试中遇到了同样的问题,解决方法是读取 CSV 文件同步。
为此,我使用了 csv-load-sync npm 包,然后阅读文件:
import * as fs from 'fs';
import * as loader from 'csv-load-sync';
import * as path from 'path';
readTestDataCsvSync() {
const filePath = path.join(__dirname, 'TestData.csv');
try {
if (fs.existsSync(filePath)) {
return loader(path.join(__dirname, 'TestData.csv'));
}
}
catch (err) {
throw new Error(`Couldn't load the test cases CSV file: ${err}`);
}
}
现在您可以像以前一样进行测试了:
describe('E2E-I18N-CMX: test country matrix', () => {
const matrix = readTestDataCsvSync();
matrix.forEach((shopFunction, roleName) = > {
it('Test ' + role, async (){
// your test
});
});
});