如何使用汇总来解析黄瓜特征文件和备份步骤定义文件

how to use rollup to parse cucumber feature files and backing step definition files

我有以下汇总插件,其中将包含 .feature 个文件

export const cucumberRollupPlugin: PluginImpl<CucumberOptions> = pluginOptions => {
  let options: CucumberOptions = {
    ...{
      include: '**/*.feature',
      cwd: process.cwd(),
    },
    ...pluginOptions,
  };

  let filter = createFilter(options);

  let plugin: Plugin = {
    name: 'bigtest-cucumber',
    async transform(code, id) {
      if (!filter(id)) {
        return;
      }

      let parser = new GherkinParser({ code, uri: id, rootDir: options.cwd });

      let result = await parser.parse();

      let esm = dataToEsm(result, { namedExports: false });

      // TODO: add sourcemap support
      let transformResult: TransformResult = { code: esm };

      return transformResult;
    },
  };

  return plugin;
};

我遇到的问题是,要使功能文件正常工作,有些步骤定义文件实际上包含功能。所以功能文件可能看起来像这样

Feature: Visit career guide page in career.guru99.com
Scenario: Visit career.guru99.com
Given: I browse to career.guru99.com

步骤定义文件可能如下所示:

import { Given, When, Then from 'cucumber';
import assert from 'assert';
import{ driver } from '../support/web_driver';

Given(/^browse to web site "([^"]*)"$/, async function(url) {
    return driver.get(url);
});

rollup 的问题是两个步骤定义文件都没有导入语句。 cucumber-js 的工作方式是在运行时找到这些文件。

我想我需要生成一个看起来像这样的 index.js 来涵盖步骤定义。

import from './step_definition_1';
import from './step_definition_2';
import from './step_definition_3';

这在汇总管道中的什么地方适合生成此文件,以便它可以被拉入汇总管道。

您需要使用 this.emitFile 方法,然后通过 glob 或插件中的其他任何方式查找文件

{
  plugins: [typescript(),{
  name: "emit-additional-files",
  async transform(code,id) {
    //id === fileName
    //code === fileContent
    // inspect code or id here then use path.resolve() and fs.readdir to find additional files
    this.emitFile()

  }
}]
}

您可以使用 this.emitFile to manually process the .feature files and include them in the output. Call this.emitFile for each .feature file in the buildStart 挂钩(每个发出的文件将通过您编写的 transform 挂钩进行处理)。

这是一个使用 globby 程序包(将 glob 扩展为文件路径数组)的示例,以获取要传递给 this.emitFile 的每个 .feature 文件的文件路径:

import globby from 'globby'

export const cucumberRollupPlugin: PluginImpl<CucumberOptions> = pluginOptions => {
  let options: CucumberOptions = {
    include: '**/*.feature',
    cwd: process.cwd(),
    ...pluginOptions,
  };

  let filter = createFilter(options);

  let plugin: Plugin = {
    name: 'bigtest-cucumber',
    async buildStart({ include, cwd }) {
      const featureFilePaths = await globby(include, { cwd });

      for (const featureFilePath of featureFilePaths) {
        this.emitFile({
          type: 'chunk',
          id: featureFilePath
        });
      }
    },
    async transform(code, id) {
      if (!filter(id)) {
        return;
      }

      let parser = new GherkinParser({ code, uri: id, rootDir: options.cwd });

      let result = await parser.parse();

      let esm = dataToEsm(result, { namedExports: false });

      // TODO: add sourcemap support
      let transformResult: TransformResult = { code: esm };

      return transformResult;
    },
  };

  return plugin;
};

如果您有任何问题,请告诉我!