如何在Cucumber步骤定义中匹配(car|cars)这类单复数可选值?
嗨,这个问题我熟!在TypeScript+Protractor+Cucumber的技术栈里,你确实可以用正则表达式实现单数/复数场景的步骤复用,而且有几种靠谱的方式,我给你拆解一下:
方法一:正则捕获数字+匹配可选单复数(非捕获组更高效)
这种方式最精准,因为我们不需要捕获car或cars这个单词,只是用来匹配场景文本,所以用非捕获组(?:...)更合适,不会生成冗余参数:
import { Given } from '@cucumber/cucumber'; Given(/^I have (\d+) (?:car|cars)$/, function (this: any, count: number) { // 这里写你的业务逻辑,比如把数量存到测试上下文里 this.carCount = count; console.log(`确认车辆数量:${count}`); });
解释一下正则的关键部分:
(\d+):捕获数字,对应参数count,会自动转成number类型(?:car|cars):非捕获组,只负责匹配"car"或"cars",不会额外生成参数
方法二:用Cucumber表达式(更简洁但稍欠精准)
如果你不想写正则,也可以用Cucumber自带的表达式占位符,不过这种方式会捕获第二个单词(car/cars),你可以选择忽略它:
Given('I have {int} {word}', function (this: any, count: number, _vehicle: string) { // _vehicle参数可以直接忽略,只使用count即可 this.carCount = count; });
注意:{word}会匹配任何单词,如果你担心场景里出现其他单词(比如"I have 3 bikes")会误匹配,还是方法一更稳妥。
为什么你之前的写法不对?
你尝试的Given(/^I have {int} (car|cars)$有两个问题:
- 正则里不能直接用
{int},这是Cucumber表达式的语法,正则里要捕获数字得用(\d+) - 正则结尾少了
$,容易出现部分匹配的问题(比如误匹配到"I have 2 cars and a bike"的前半段)
最后提醒:确保你的步骤定义文件在Protractor的Cucumber配置里被正确引入,这样场景才能关联到对应的步骤哦!
内容的提问来源于stack exchange,提问作者rozza
相关产品推荐
相关产品推荐

