You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cucumberjs与Gherkin:无法使用“And”“But”步骤的原因及解决方法

解决Cucumber.js中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:50:01