Cucumberjs与Gherkin:无法使用“And”“But”步骤的原因及解决方法
嘿,这个问题我当初刚用Cucumber.js的时候也踩过坑!其实核心是对Gherkin步骤和Cucumber.js API的理解偏差,咱们一步步说清楚:
为什么会报错?
Gherkin里的And和But并不是独立的步骤类型,它们只是用来让Feature文件的场景描述更流畅、更贴近自然语言的语法糖而已。在执行阶段,Cucumber会自动把And/But关联到它前面最近的Given/When/Then步骤类型。
而Cucumber.js的API只暴露了Given、When、Then这三个全局函数用来定义步骤,根本没有提供单独的And或But函数——所以你在代码里直接调用And(...)或者But(...),自然会报“找不到对象”的引用错误。
怎么正确使用And/But?
完全不需要在代码里定义And/But步骤,只需要按下面的方式操作:
1. 在Feature文件里正常写And/But
比如你的Feature可以这么写:
Feature: 用户登录流程 Scenario: 输入正确信息成功登录 Given 我打开了网站的登录页面 When 我输入用户名 "admin" And 我输入密码 "123456" Then 页面跳转到用户控制台 But 页面上没有显示错误提示框
2. 在步骤定义里只用Given/When/Then
针对上面的场景,你只需要定义对应的Given、When、Then步骤就好,And和But会自动匹配前面最近的步骤类型:
const { Given, When, Then } = require('cucumber'); Given('我打开了网站的登录页面', function () { // 这里写打开登录页的逻辑 }); When('我输入用户名 {string}', function (username) { // 处理用户名输入 }); When('我输入密码 {string}', function (password) { // 处理密码输入 }); Then('页面跳转到用户控制台', function () { // 验证页面跳转 }); Then('页面上没有显示错误提示框', function () { // 验证错误提示不存在 });
运行的时候,And 我输入密码...会自动匹配你用When定义的步骤,But 页面上没有显示...会匹配Then定义的步骤,完全不需要额外操作。
进阶:用defineStep实现通用步骤
如果某个步骤逻辑想被多种类型的步骤(比如Given/When/Then/And/But)复用,可以用Cucumber.js提供的defineStep函数,它可以匹配任意类型的步骤:
const { defineStep } = require('cucumber'); defineStep('我输入密码 {string}', function (password) { // 这个步骤可以被When、And、甚至Given/Then调用 });
总结一下
And和But只是Feature文件的语法糖,不需要在代码里单独定义——只要你已经用Given/When/Then定义了对应的步骤文本,在Feature里直接写And/But就会正常工作,别去代码里调用不存在的And()/But()函数就行啦!
内容的提问来源于stack exchange,提问作者Luis

