ãã€ãã£ãECMAScriptã¢ãžã¥ãŒã«ã§å®çŸ©ãããã¹ãããå®çŸ©ã䜿çšããŠCucumber.jsãå®è¡ããããšãããšïŒããã«èšèŒãrequire()
ã䜿çšããŠãããšããèŠåã衚瀺ãããŠå€±æããŸãã
Cucumber.jsããŒãžã§ã³ïŒ 6.0.5
ããŒãããŒãžã§ã³ïŒ 13.8.0
npm init
ãšnpm i cucumber
ã䜿çšããŠåºæ¬çãªNPMããã±ãŒãžãã£ã¬ã¯ããªãèšå®ããŸãpackage.json
ãã¡ã€ã«ã«"type": "module"
ããŠãJSãã¡ã€ã«ããã€ãã£ãã¢ãžã¥ãŒã«ãšããŠæ±ãããããã«ããŸãåºæ¬çãªæ©èœãã¡ã€ã«features/mjs.feature
äœæããŸãã
Feature: Native JS Modules
Scenario: Load a native JS module step definition
Given I have 42 cucumbers in my belly
åºæ¬çãªã¹ãããå®çŸ©ãã¡ã€ã«features/step_definitions.js
äœæããŸãã
import { Given } from "cucumber";
Given("I have {int} cucumbers in my belly", function (cucumberCount) {
console.log("Step parsed.");
});
ãã¥ãŠãªãå®è¡ããããšããŸãïŒ
$ ./node_modules/.bin/cucumber-js
ã¹ãããå®çŸ©ã¢ãžã¥ãŒã«ãããŒãããŠãã¹ãããã解æããããã«äœ¿çšããå¿ èŠããããŸãã
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /some/path/cucumbertest/features/step_definitions.js
require() of ES modules is not supported.
require() of /some/path/cucumbertest/features/step_definitions.js from /some/path/cucumbertest/node_modules/cucumber/lib/cli/index.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename step_definitions.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /some/path/cucumbertest/package.json.
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:13)
at Module.load (internal/modules/cjs/loader.js:1000:32)
at Function.Module._load (internal/modules/cjs/loader.js:899:14)
at Module.require (internal/modules/cjs/loader.js:1040:19)
at require (internal/modules/cjs/helpers.js:72:18)
at /some/path/cucumbertest/node_modules/cucumber/lib/cli/index.js:119:42
at Array.forEach (<anonymous>)
at Cli.getSupportCodeLibrary (/some/path/cucumbertest/node_modules/cucumber/lib/cli/index.js:119:22)
at Cli.run (/some/path/cucumbertest/node_modules/cucumber/lib/cli/index.js:141:37)
at async Object.run [as default] (/some/path/cucumbertest/node_modules/cucumber/lib/cli/run.js:30:14)
䟡å€ã®ããããšãšããŠãCucumber.jsããŒã ããã®ãããžã§ã¯ãã«æå
¥ããäœæ¥ã«æ¬åœã«æè¬ããŠããŸããããã¯ãç§ãšç§ã®äŒç€Ÿã«ãšã£ãŠå€§ããªè³ç£ã§ããã ç§ã®ããŒã ã¯ããã€ãã£ãJSã¢ãžã¥ãŒã«ã§ããã€ãã®å
±æã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ããæ§ç¯ããããšã«æéãè²»ãããŠããŸãããæè¿ãŸã§ãïŒææ°ã®ããã¥ã¡ã³ãã®import
æ§æã«åºã¥ããŠïŒãã®ãããªãã®ãCucumberã§æ©èœãããšæ³å®ããŠããŸããããã¹ããã¬ãŒã ã¯ãŒã¯ãšã®çµ±åã«åãæãããŸããã ããããããã§ã¯ãªãããã§ãã å
±æã³ã³ããŒãã³ãã¯ãã§ã«èšè¿°ãããŠãããã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã«çµ±åãããŠãããããçžäºéçšæ§ã®åé¡ããããããCommonJSã§èšè¿°ãããã¹ãããå®çŸ©ãšãµããŒãã³ãŒãã®ã¿ã䜿çšããããšã«ã¯æ¶æ¥µçã§ãã
ãããæ©èœãããããã«ç§ãè©Šã¿ãä»ã®äºæãå«ãŸããŠããŸã...
.mjs
æ¡åŒµåãä»ããïŒããã«ãããCucumberã®èªåèªã¿èŸŒã¿ããžãã¯ã«ãã£ãŠèŠèœãšããã --require
ã䜿çšããŠã¹ãããå®çŸ©ã¢ãžã¥ãŒã«ãæ瀺çã«èªã¿èŸŒããšError [ERR_REQUIRE_ESM]: Must use import to load ES Module
import()
é¢æ°ã䜿çšããCJSã¢ãžã¥ãŒã«ã§ãã€ãã£ãã¢ãžã¥ãŒã«ãã©ããããŸãã åé¡ã¯ããã®ã¢ãããŒããéåæã§ãããã€ã³ããŒãã®çŽæãCJSã¢ãžã¥ãŒã«ã«ãã£ãŠãšã¯ã¹ããŒãããããšããŠããã¹ããããæªå®çŸ©ãšããŠããŒã¯ãããŠãããããCucumberã¯ãã®çŽæã解決ãããã®ãåŸ
ã£ãŠããªãããã«èŠããããšã§ããïŒã¹ãããã®å®çŸ©ã瀺åããŠããŸãïŒãã€ãã£ãã¢ãžã¥ãŒã«ã§ã¯ãŸã ç»é²ãããŠããŸããïŒãç§ã®èœåã®ç¯å²å ã§ããã°ããã®åé¡ã®è§£æ±ºã«åœ¹ç«ã€PRãæåºã§ããã°å¹žãã§ãããCucumber.jsã®å éšåäœã«æ £ããŠããªãããã誰ããç§ãæ£ããæ¹åã«åããŠãããã°å¹žãã§ãã
cucumber-jsãESMã§åäœããããã®ã§ããã ç§ãã¡ã¯ãã§ã«ããã«ã€ããŠä»ã®ããã€ãã®åé¡ãéããŠããŸããã
cucumber-jsãrequireã®ä»£ããã«import
䜿çšããŠãè¿ãããpromiseãåŸ
æ©ããããã«ãããCLIãªãã·ã§ã³ãäœæããïŒãŸãã¯ä»ã®æ¹æ³ã䜿çšããŠãŠãŒã¶ãŒããã€äœ¿çšããããæ¢ãïŒããšãã§ããŸãã
è¿œå ããäŸãèãããšãããå°çšã®ãã¹ãã±ãŒã¹ãè¿œå ããŠãåæ Œãããããšãã§ããŸãã åãæ¿ããè©Šãã«ã¯ãã€ã³ããŒãããŠpromiseãåŸ ã€å¿ èŠãããããã®åŸãå¥ã®ãšã©ãŒãçºçããŸããã
â> ~/p/test ./node_modules/.bin/cucumber-js 21:05:22
(node:7422) ExperimentalWarning: The ESM module loader is experimental.
file:///test/features/steps.js:1
import { Given } from "cucumber";
^^^^^
SyntaxError: The requested module 'cucumber' does not provide an export named 'Given'
at ModuleJob._instantiate (internal/modules/esm/module_job.js:92:21)
at async ModuleJob.run (internal/modules/esm/module_job.js:107:20)
at async Loader.import (internal/modules/esm/loader.js:176:24)
at async Promise.all (index 0)
at async Cli.getSupportCodeLibrary (/test/node_modules/cucumber/lib/cli/index.js:119:5)
at async Cli.run (/test/node_modules/cucumber/lib/cli/index.js:141:32)
at async Object.run [as default] (/test/node_modules/cucumber/lib/cli/run.js:30:14)
ã¹ãããå®çŸ©ã®ããã¥ã¡ã³ãããäŸïŒãããã«å€æŽïŒãåããŸãããããã®éãã§ããèšè¿°ã©ããã«æ©èœããŸããã Cucumber.jsã¯CommonJSã¢ãžã¥ãŒã«ã§ãããããããã©ã«ãã®ãšã¯ã¹ããŒãã®ã¿ãæäŸããŸãã çæçã«ã¯ãã¢ãžã¥ãŒã«ã®ããã©ã«ããã€ã³ããŒãããŠãããããGiven / When / Thenã¡ãœããã«ã¢ã¯ã»ã¹ããã ãã§ãã
import cucumber from "cucumber";
cucumber.Given(...);
é·æçã«ã¯ãããã«ç€ºãããã«ãCucumberã«ã€ã³ããŒãçšãšrequireçšã®å¥ã ã®ãšã³ããªãã€ã³ãããããšäŸ¿å©ã§ãã
ãããèŠãŠãããŠããããšãã ãã®äŸ¡å€ã«ã€ããŠã¯ãCucumberã«èŠæ±ãã代ããã«ã€ã³ããŒãããããã«æ瀺ããCLIãªãã·ã§ã³ãé©ããŠããŸãã ãŸããCucumberã.cjsããã³.mjsæ¡åŒµåã®ä»ãããµããŒããã¡ã€ã«ãæ¢ããããããããããCommonJSããã³ãã€ãã£ãã¢ãžã¥ãŒã«ãšããŠèªåçã«åŠçããããšãã§ããŸãã
ç·šéïŒå¯èœã§ããã°ãããã«ã€ããŠåãã§ãæäŒãã§ããããšãç¹°ãè¿ãè¿°ã¹ãããšæããŸãã ç§ãæ£ããæ¹åã«åããŠãã ããã
ã¢ãžã¥ãŒã«ã®ããã©ã«ããã€ã³ããŒãããŠãããããGiven / When / Thenã¡ãœããã«ã¢ã¯ã»ã¹ããã ãã§ãã
ããã ããããããã ãããèŒžå ¥ããã
cucumber.GivenïŒ...ïŒ;
ããã¯æ©èœããŸããã åãã¡ãã»ãŒãžã衚瀺ãããŸãã
package.jsonã« "type"ïŒ "module"ãããããããžã§ã¯ãã®æ®ãã®éšåã¯ã¢ãžã¥ãŒã«ã䜿çšããŠããããããããå€æŽããããšã¯ã§ããŸããã
ãããã®ããããã䜿çšããå ŽåïŒ
import cucumber from '@cucumber/cucumber';
// OR
import { When } from '@cucumber/cucumber';
å
ã®æçš¿ãšåããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã
ã«å€æŽããå Žå
const cucumber = require('@cucumber/cucumber');
次ã«ããã®ã¡ãã»ãŒãžã衚瀺ãããŸãã
代ããã«ã/ some / path / cucumbertest / features / step_definitions.jsã®ååã.cjsã§çµããããã«å€æŽããããimportïŒïŒã䜿çšããããã«å¿ èŠãªã³ãŒããå€æŽããããproject / package.jsonãããtypeãïŒãmoduleããåé€ããŠãã ããã
step_definitions.js
ååã_ step_definitions.cjs
ãŸãã¯step_definitions.mjs
ã«å€æŽãããšãç¡èŠããããã¥ãŠãªããã¹ãããã®ã¹ã¿ããäœæããããã«ãšããäžè¬çãªã¡ãã»ãŒãžã衚瀺ãããŸãã
UUUUUU
Failures:
1) Scenario: Empty Payload # spec\cucumber\features\users\create\main.feature:4
? When the client creates a POST request to /users
Undefined. Implement with the following snippet:
When('the client creates a POST request to \/users', function () {
// Write code here that turns the phrase above into concrete actions
return 'pending';
});
... etc
ãã¡ã€ã«ãå®å šã«åé€ãããšãŸã£ããåãã¡ãã»ãŒãžã衚瀺ããããããæããã«ç¡èŠãããŠããŸãã
çµå±ããtypeãïŒãmoduleãã䜿çšããŠãããžã§ã¯ãã§ãã¥ãŠãªãå®è¡ããããšãã§ããå¯äžã®æ¹æ³ã¯ããtypeãïŒãmoduleãã䜿çšããã«å¥ã®specpackage.jsonãäœæãããã¥ãŠãªãspec/node_modules
ã€ã³ã¹ããŒã«ããããšã§ãã
ãããŸã§ã®ãšãããããã¯æ©èœããŠããããã§ãã å®éã®ãã¹ããããã€ãäœæããããããããŸã æ©èœãããã©ãããèŠãŠã¿ãŸãããã
ã¡ã³ããã®çãããžïŒãã¥ãŠãªã䜿ãã®ã¯åããŠã§ãä»ã®ãšããæ°ã«å ¥ã£ãŠããŸãã ããããããã¯æ¬åœã«ç§ã®é²æ©ã«ææãäžããŸããã ååŸã«ãã¥ãŠãªãåŠã¶ä»£ããã«ãã€ã³ããŒãã®ãããã°ã«è²»ãããŸããã ES6ã®ã€ã³ããŒããšCJSã®äž¡æ¹ããµããŒãããã©ã€ãã©ãªãäœæããããšããã®ãããã«é¢åããç¥ã£ãŠããã®ã§ããèŠèãç³ãäžããŸãã
èãããã解決çïŒ
2çªç®ã®distãã¡ã€ã«ãçæãããšãCJSãã«ããšES6ãã«ãã®äž¡æ¹ãäžåºŠã«å
¬éã§ããŸãã
dist / cucumber.js
dist / cucumber.module.js
次ã«ããã®è¡ãpackage.jsonã«è¿œå ããŸãã
"ã¢ãžã¥ãŒã«"ïŒ "dist / cucumber.module.js"
ããã«ãããããŒããES6ã€ã³ããŒãã解決ã§ããããã«ãªããŸãã
ãããè¡ãããã®ããè¯ãæ¹æ³ãå¿
èŠã§ãã ç§ããã®åé¡ãæ±ããŠããŸããã€ã³ããŒãã¯commonJSã§äœ¿çšã§ããªãããã䜿çšããå¿
èŠããããŸãã
https://nodejs.org/api/esm.html#esm_import_expressions
ã©ãã«ã§ã...
Eã䜿çšã§ããããã«ããããã«Cucumberã«ãã©ã°ãä»ããæ¹æ³ã¯ãããŸããïŒ
ããã«èå³ã®ãã人ã®ããã®ç°¡åãªãã®ïŒãã¥ãŠãªã䜿ã£ããããžã§ã¯ãã§ESMã䜿çšãããšããããªãã¯æ¬¡ã®ããšãããŸããïŒ
.js
æ¡åŒµåãš"type":"module"
.mjs
æ¡åŒµåã䜿çšããããããšãïŒ
ç§ã¯ããããŸãããé¿ããããã«ããã¹ãŠã®JavaScriptãã¡ã€ã«ã«.mjsããã³.cjsæ¡åŒµåã䜿çšãããšããèŠåã«åŸãåŸåããããŸãããã®å Žåããããããããšããå§ãããŸãã ãã ãããããžã§ã¯ãã¬ãã«ã§ãtypeãïŒãmoduleããèšå®ãããããããå€ãã®ãŠãŒã¶ãŒã«ãšã£ãŠããè¯ããœãªã¥ãŒã·ã§ã³ã§ããå Žåã¯ããããã.jsãã¡ã€ã«ã®ãŸãŸã«ããŠããããšã¯å€§ããªäžäŸ¿ã§ã¯ãããŸããã
.js
æ¡åŒµåãš"type":"module"
ã䜿çšããŸããããã¯ãé·æçã«ã¯æšæºã«ãªããšäºæ³ããŠããããã§ãã
ãã£ãŒãããã¯ãããããšã@ adamlacoste
@ davidjgoss ïŒ1589ãããŒãžããã ãã§ããã®åé¡ã解決ã§ããŸããïŒ ãããšãäœãä»ã®ãã®ãå¿ èŠã§ããïŒ
@ aurelien-reevesã埮調æŽããŠãããŠããããšãïŒ
@cucumber/cucumber
ããŒãžã§ã³7.2.0ãnpmã«è¿œå ãããŸãããããã«ã¯ã以äžã®ããã¥ã¡ã³ãã§èª¬æãããŠããESMã®å®éšçãªãµããŒããå«ãŸããŸãã
https://github.com/cucumber/cucumber-js/blob/master/docs/cli.md#es-modules-experimental-nodejs-12
èå³ã®ãã人ãè©ŠããŠã¿ãŠãããªããèŠã€ãããã®ãå ±åããããšãã§ããã°ãããã¯çŽ æŽãããããšã§ãã ç§ã¯ããã«è¶
æå°éã®ãµã³ãã«ãããžã§ã¯ããèŒããŸããïŒ
https://github.com/davidjgoss/cucumber-esm-example
åæã®ãã£ãŒãããã¯ã1ãæã§ææ¡ããããã«ããã®åé¡ãå°ãã®ééãããŸãŸã«ããŠãããŠãã ããã
ãã®ããããã®å€æŽã«ãããïŒãšã³ããªãã€ã³ãããã§ã¯ãªãïŒç¹å®ã®ãã®ãçŽæ¥require
ãããµãŒãããŒãã£ã®ãã¬ãŒã ã¯ãŒã¯ãšãã©ãŒããã¿ã§åé¡ãçºçããŸããã ç§ã¯7.2.1ããªãªãŒã¹ããŸãããããã¯åºæ¬çã«7.1.0ã«æ»ã£ãŠãããã®äººã
ã®ãããã¯ã解é€ããŸããåå ãæãäžããŠãESMããµããŒãããªãããããåé¿ã§ãããã©ããã確èªããŸãã ãããŸã§ã®éããããããªãã«åœ±é¿ãäžããªãã®ã§ããã°ã7.2.0ã¯ãŸã å®éšããããã«ããã«ãããŸãã
--esm
ãã©ã°ãšäžç·ã«v7.2.0
è©ŠããŠã¿ãŸããã ESMã«å€æããããšããŠããããã±ãŒãžã®ãã¹ãã§testdoubleã䜿çšããŠããŸãã
td.replaceEsm
䜿çšããã«ã¯ã --loader=testdouble
ããã«ããŒããŒã䜿çšããå¿
èŠããããŸãã ããŒããŒããã¥ãŠãªã®CLIã«çŽæ¥æäŸããããšãããšã次ã®ãšã©ãŒãçºçããŸãã
> cucumber-js test/integration --esm --loader=testdouble
error: unknown option '--loader=testdouble'
ãã®ãªãã·ã§ã³ãå©çšã§ããªãã£ãã®ã§ãç§ã¯ããããNODE_OPTIONS
è©Šã¿ãŸããïŒ
> NODE_OPTIONS='--loader=testdouble' cucumber-js test/integration --esm
(node:62231) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
internal/process/esm_loader.js:74
internalBinding('errors').triggerUncaughtException(
^
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension "" for /path/to/project/node_modules/@cucumber/cucumber/bin/cucumber-js
at defaultGetFormat (internal/modules/esm/get_format.js:71:15)
at getFormat (file:///path/to/project/node_modules/quibble/lib/quibble.mjs:65:12)
at Loader.getFormat (internal/modules/esm/loader.js:104:42)
at Loader.getModuleJob (internal/modules/esm/loader.js:242:31)
at async Loader.import (internal/modules/esm/loader.js:176:17)
at async Object.loadESM (internal/process/esm_loader.js:68:5) {
code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
åèãŸã§ã«ãããã¯ããŒãv14.17.0
ãããNODE_OPTIONS
ã¢ãããŒãã§æ©èœããã®ã¯è¯ãããšã§ãããçæ³çã«ã¯ãäžéšã®ãã¹ããã¬ãŒã ã¯ãŒã¯ããµããŒããéå§ããããã«ã --loader
ãªãã·ã§ã³ãCLIã«ãã£ãŠçŽæ¥ãµããŒããããŸãã ESMãµããŒãã«ã¢ãããŒããã次ã®ããŒãžã§ã³ã§ãããã®ã¢ãããŒããæ€èšããŠãã ãã:)
v7.2.0
åäœãããšäºæ³ãããããŒããŒãå®çŸ©ããæ¹æ³ã¯ãããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
.js
æ¡åŒµåãš"type":"module"
ã䜿çšããŸããããã¯ãé·æçã«ã¯æšæºã«ãªããšäºæ³ããŠããããã§ãã