量角器之外的打字稿和异步初始化

Typescript and async initialisation outside protractor it

我使用 csv-parserCSV 文件中读取了一个测试配置,它的行为是异步的。当我将解析器包装在一个 Promise 中并在我的异步 it 测试用例中使用它时 await 配置数据被解析......在 'it' 之外它不是已解决,因为 describe 不支持 async 并且 module: commonjs 不允许顶级 await。 配置数据包含测试数据,用于 运行 在具有不同参数的循环中的 'it' 测试用例上。 所以我需要一种方法:

  1. 解决 'it' 之外的承诺以获取配置数据或
  2. 找到一种方法来等待 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
        });
    });
});