如何使用Cypress测试句子包含指定数组任意值即通过断言
多可选值文本断言测试实现方法
问题场景
我正在探索实现句子内容测试的可行方法。
测试前置定义如下:
- 可选宠物值数组:
let pet = ['dog', 'cat', 'bird']
- 待校验句子,占位符位置会随机填充上述数组中的某一个值:
let sentense = 'John adopt a {oneofthepet} last night'
传统单值断言只能校验固定匹配结果,无法覆盖所有可能场景,写法如下:
sentense.should('have.text', 'John adopt a dog last night')
当前需求是:只要句子内容匹配宠物数组对应的任意一种拼接结果,即可判定测试通过,等价于以下三个断言任一命中即通过:
sentense.should('have.text', 'John adopt a dog last night') sentense.should('have.text', 'John adopt a cat last night') sentense.should('have.text', 'John adopt a bird last night')
可行实现方案
方案1:正则匹配(推荐,写法最简洁)
直接构造覆盖所有可选值的正则规则做匹配,不需要循环遍历:
// 拼接生成匹配任意宠物值的正则 const matchReg = new RegExp(`^John adopt a (${pet.join('|')}) last night$`) // 做正则匹配断言 sentense.should('match', matchReg)
注意:如果可选值里包含正则特殊字符(比如.、*这类),需要先对值做转义处理,避免正则匹配逻辑异常。
方案2:遍历值做存在性校验
如果不希望使用正则,也可以遍历可选值列表,只要存在一个和实际文本完全匹配的结果,就判定断言通过:
// 先获取元素实际文本 const actualContent = sentense.text() // 判断是否存在匹配的可选值 const checkPass = pet.some(petType => actualContent === `John adopt a ${petType} last night`) // 断言校验结果为真 expect(checkPass).to.be.true
如果是Cypress环境下的链式调用写法,也可以直接写成:
sentense.invoke('text').should('satisfy', (actualText) => { return pet.some(petType => actualText === `John adopt a ${petType} last night`) })
内容的提问来源于stack exchange,提问作者Khant
相关产品推荐
相关产品推荐

