两步定义相同,但一个用于给定,一个用于Then

时间:2017-11-04 03:49:40

标签: regex cucumber

如果我尝试使用两个相似的步骤定义但使用不同的注释,则黄瓜特征文件会抛出错误(声明了多个步骤定义) -

@Then("^element with id \"([^\"]*)\"  is displayed$")

&

@Given("^element with id \"([^\"]*)\" is displayed$")

到目前为止,我已经通过在@Then定义中添加一个额外空格来欺骗它(在正则表达式之后仔细查看@Then)。

但这不是好习惯。

我想要@Given,因为它设置了我的场景,我绝对需要@Then。

我如何通过这个?

2 个答案:

答案 0 :(得分:1)

步骤定义必须是Cucumber唯一知道要执行的内容。此外,Given / When / Then关键字在技术上可以互换。它们是为了提供功能文件的可读性,但没有与实现相关联。因此,如果两个步骤(Given和Then)都做同样的事情,那么技术上没有问题;您应该可以在功能文件中使用相同的步骤定义,前面加上“给定”和“#39;或者'那么'关键词。 也就是说,您可能需要考虑重写步骤定义以描述预期的行为而不是实现,例如"给定一个id为xxx"

的元素

答案 1 :(得分:0)

当cuking给定应该设置状态时,然后应该对内容进行断言。你的Given是构造糟糕的,因为它是关于在页面上断言什么。您应该重写它,以便描述您需要做什么以确保可以看到特定元素。

例如,如果您的Given匹配

Given "element with id 'product_foo' is displayed"

应该在阅读

的场景中改写给定

Given 'there is a product foo'

实际上,即使是小型应用程序,您也无法实现Given("^element with id \"([^\"]*)\" is displayed$")的一般用法,因为它必须知道如何在任何上下文中创建可能在应用程序中显示的所有内容。您可能会在产品页面上或订购时或在购物篮中看到id product_foo。第一个只需要一个产品,但第二个需要先前的订单,第三个需要与产品在篮子里的会话。