gpt4 book ai didi

typescript - 通过 nrwl nx 在 cypress 中使用 .feature 文件

转载 作者:行者123 更新时间:2023-12-03 14:38:35 27 4
gpt4 key购买 nike

我有一个带有 Nrwl Nx 工作区的 Angular 项目。对于我的 e2e 测试,我使用带有 typescript 的 cypress。对于这个测试,我想启用对带有 Gherkin 语法的功能文件的支持。

我在项目中添加了“cypress-cucumber-preprocessor”。当我使用 js 编写绑定(bind)时,此设置工作正常。但是,一旦我尝试设置 typescript 的步骤,就会出现错误,并且无法使其正常工作。

js的设置:

const { preprocessTypescript } = require('@nrwl/cypress/plugins/preprocessor');
const cucumber = require('cypress-cucumber-preprocessor').default;

module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config

// Code Coverage
on('task', require('@cypress/code-coverage/task'));

// Preprocess Typescript
on('file:preprocessor', preprocessTypescript(config));

// Gherkin support
on('file:preprocessor', cucumber());
};

ts 的设置:
const { preprocessTypescript } = require('@nrwl/cypress/plugins/preprocessor');
const cucumber = require('cypress-cucumber-preprocessor').default;
const browserify = require('@cypress/browserify-preprocessor');

module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config

// Code Coverage
on('task', require('@cypress/code-coverage/task'));

// Preprocess Typescript
on('file:preprocessor', preprocessTypescript(config));

// Gherkin support
const options = browserify.defaultOptions;
options.browserifyOptions.plugin.unshift(['tsify']);
on('file:preprocessor', cucumber());
};
{
"name": "client-app",
"version": "0.0.0",
"license": "MIT",
"scripts": {
"ng": "ng",
"nx": "nx",
"start": "ng serve",
"start:browser": "ng serve -o --port 54055",
"build": "ng build",
"build:ssr": "ng run client-app:server:production",
"test": "ng test",
"lint": "nx workspace-lint && ng lint",
"e2e": "ng e2e",
"e2e:watch": "ng e2e --watch",
"e2e:headless": "ng e2e --prod --headless",
"affected:apps": "nx affected:apps",
"affected:libs": "nx affected:libs",
"affected:build": "nx affected:build",
"affected:e2e": "nx affected:e2e",
"affected:test": "nx affected:test",
"affected:lint": "nx affected:lint",
"affected:dep-graph": "nx affected:dep-graph",
"affected": "nx affected",
"format": "nx format:write",
"format:write": "nx format:write",
"format:check": "nx format:check",
"update": "ng update @nrwl/workspace",
"update:check": "ng update",
"workspace-schematic": "nx workspace-schematic",
"dep-graph": "nx dep-graph",
"help": "nx help",
"extract:clientApp": "ngx-translate-extract --input ./apps/client-app/src --output ./apps/client-app/src/assets/i18n/de.json ./apps/client-app/src/assets/i18n/en.json ./apps/client-app/src/assets/i18n/fr.json ./apps/client-app/src/assets/i18n/it.json --clean --sort",
"extract:clientAppe2e": "ngx-translate-extract --input ./apps/client-app/src --output ./apps/client-app-e2e/src/fixtures/i18n/de.json ./apps/client-app-e2e/src/fixtures/i18n/en.json ./apps/client-app-e2e/src/fixtures/i18n/fr.json ./apps/client-app-e2e/src/fixtures/i18n/it.json --clean --sort"
},
"private": true,
"dependencies": {
"@angular/animations": "^8.0.0",
"@angular/cdk": "^8.1.1",
"@angular/common": "^8.0.0",
"@angular/compiler": "^8.0.0",
"@angular/core": "^8.0.0",
"@angular/flex-layout": "^8.0.0-beta.26",
"@angular/forms": "^8.0.0",
"@angular/material": "^8.1.1",
"@angular/platform-browser": "^8.0.0",
"@angular/platform-browser-dynamic": "^8.0.0",
"@angular/platform-server": "^8.1.3",
"@angular/pwa": "^0.801.2",
"@angular/router": "^8.0.0",
"@angular/service-worker": "^8.0.0",
"@aspnet/signalr": "1.0.3",
"@ngrx/effects": "^8.2.0",
"@ngrx/entity": "^8.2.0",
"@ngrx/router-store": "^8.2.0",
"@ngrx/store": "^8.2.0",
"@nguniversal/module-map-ngfactory-loader": "^8.1.1",
"@ngx-translate/core": "^11.0.1",
"@ngx-translate/http-loader": "^4.0.0",
"@nrwl/angular": "8.4.0",
"@types/file-saver": "^2.0.1",
"applicationinsights-js": "^1.0.20",
"aspnet-prerendering": "^3.0.1",
"core-js": "^2.5.4",
"file-saver": "^2.0.2",
"hammerjs": "^2.0.8",
"ngx-infinite-scroll": "^7.2.0",
"rxjs": "~6.4.0",
"zone.js": "^0.9.1"
},
"devDependencies": {
"@angular-devkit/build-angular": "^0.800.1",
"@angular/cli": "8.1.1",
"@angular/compiler-cli": "^8.0.0",
"@angular/language-service": "^8.0.0",
"@biesbjerg/ngx-translate-extract": "^2.3.4",
"@cypress/code-coverage": "^1.8.0",
"@ngrx/store-devtools": "^8.2.0",
"@nrwl/cypress": "8.4.0",
"@nrwl/jest": "8.4.0",
"@nrwl/linter": "^8.4.1",
"@nrwl/workspace": "8.4.0",
"@types/applicationinsights-js": "^1.0.9",
"@types/cypress-cucumber-preprocessor": "^1.12.0",
"@types/jest": "24.0.9",
"@types/node": "^12.6.8",
"codelyzer": "~5.0.1",
"cypress": "3.4.0",
"cypress-cucumber-preprocessor": "^1.16.0",
"dotenv": "6.2.0",
"istanbul-lib-coverage": "^2.0.5",
"jest": "24.1.0",
"jest-preset-angular": "7.0.0",
"ngrx-store-freeze": "^0.2.4",
"nyc": "^14.1.1",
"prettier": "1.16.4",
"ts-jest": "24.0.0",
"ts-node": "~7.0.0",
"tsify": "^4.0.1",
"tslint": "~5.11.0",
"typescript": "~3.4.5"
},
"cypress-cucumber-preprocessor": {
"nonGlobalStepDefinitions": true
}
}

此设置出现以下错误:

SyntaxError:“import”和“export”可能只出现在“sourceType:module”中

最佳答案

我找到了 Balázs Tápai 写的一篇文章:I'm in a Pickle - Configuring Gherkin with NX Workspaces .出于某种原因,它并不完全完整,但确实很有帮助。
经过几个小时的汗水和哭泣,我可以有一个运行的例子。阅读文章,然后按照以下步骤操作:
设置小 cucumber
添加 npm 包npm i -D cypress-cucumber-preprocessor请注意 tsify不需要。
添加配置文件
在 nx 项目的根目录下,添加一个名为 cypress-cucumber-preprocessor.config.js 的文件cypress-cucumber-preprocessor位于 package.json 的属性(property)是多余的,如果存在应该删除。

const path = require("path");

const stepDefinitionsPath = path.resolve(process.cwd(), "./src/integration");
const outputFolder = path.resolve(process.cwd(), "../../cyreport/cucumber-json");

module.exports = {
nonGlobalStepDefinitions: true,
stepDefinitions: stepDefinitionsPath,
commonPath: stepDefinitionsPath, // I added this line, not sure if necessary
cucumberJson: {
generate: true,
outputFolder: outputFolder,
filePrefix: "",
fileSuffix: ".cucumber"
}
};
编写测试
在文件夹中 integration您的 e2e 项目:
添加 simple.feature
Feature: Simple test

Simple test feature

@focus
Scenario: I always pass
Given I pass
Then I see "the expected text"
添加 simple.test.ts
import { assert } from 'console';
import { Given, Then } from 'cypress-cucumber-preprocessor/steps';

Given(/I pass/, () => {
console.log('Congrats!');
});

Then('I see {string}', (text: string) => {
console.log(text === 'the expected text');
});
预处理泡菜
验证 cypress.json看起来像这样:
{
"fileServerFolder": ".",
"fixturesFolder": "./src/fixtures",
"integrationFolder": "./src/integration",
"modifyObstructiveCode": false,
"pluginsFile": "./src/plugins/index",
"supportFile": "./src/support/index.ts",
"video": true,
"videosFolder": "../../dist/cypress/apps/sandbox-e2e/videos",
"screenshotsFolder": "../../dist/cypress/apps/sandbox-e2e/screenshots",
"chromeWebSecurity": false,
"testFiles": "**/*.{feature,features}"
}
重写 plugins/index.js这部分与文章中的部分略有不同。
const { preprocessTypescript } = require('@nrwl/cypress/plugins/preprocessor');

// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
module.exports = (on, config) => {
on('file:preprocessor', preprocessTypescript(config, customizeWebpackConfig));
return config;
}

function customizeWebpackConfig(webPackConfig) {
webPackConfig.node = {
fs: "empty",
child_process: "empty",
readline: "empty",
};

pushFeature(webPackConfig);
pushFeatures(webPackConfig);

return webPackConfig;
}

function pushFeature(webPackConfig) {
pushModuleRule(webPackConfig, /\.feature$/, 'cypress-cucumber-preprocessor/loader');
}

function pushFeatures(webPackConfig) {
pushModuleRule(webPackConfig, /\.features$/, 'cypress-cucumber-preprocessor/lib/featuresLoader');
}

function pushModuleRule(webPackConfig, testRegex, loaderLib) {
webPackConfig.module.rules.push({
test: testRegex,
use: [{ loader: loaderLib }]
});
}
代码覆盖率? html记者!
我尝试使用 @cypress/code-coverage但它不起作用。所以我将它从解决方案中删除。
文章随后描述了如何为企业主添加 html 报告。它是直截了当的(如果您为 dev chalkcucumber-html-reporter 安装)因此没有在这里复制。

关于typescript - 通过 nrwl nx 在 cypress 中使用 .feature 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58374064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com