Cucumber::ArityMismatchError
Cucumber::ArityMismatchError
我有这些 .feature
陈述:
I am logged in as an "Teacher".
I am logged in as an "Professor".
I am logged in as an "Student".
I am logged in as a "NoRole"
为此我写了一个正则表达式
I (\w{2})?\s?(log|login|logged)\s?(\w{2}) as (an|a) "(Teacher|Professor|Student|NoRole)"\.?
我将它们放在引号中,这样我就可以 运行 像这样对它们进行 case 屏蔽:
case role_type
when 'Student'
on(LoginPage).login_with(FigNewton.Studnet_email,'password')
and so on ... for other roles
现在当我 运行 这个正则表达式在步骤定义中 Given
Given(/^I (\w{2})?\s?(log|login|logged)\s?(\w{2}) as (an|a) "(Teacher|Professor|Student|NoRole)"\.?$/) do |user_role|
# code
end
它给出了这个错误:
Cucumber::ArityMismatchError: Your block takes 1 argument, but the Regexp matched 5 arguments
查询:据我所知,参数是引号之间的参数,例如 "Professor" 所以它在谈论哪五个参数。
在这个Cucumber::ArityMismatchError error after Transform上我发现不应该有任何块,但是如果没有块我的regex
就不会工作,
那么如何将角色类型与 regex arguments(blocks)
分开
如错误消息所述,步骤定义需要一个参数 - user_role
。但是,您捕获了 5 个组,这意味着您传递了 5 个参数:
- (\w{2})
- (登录|登录|登录)
- (\w{2})
- (一个|一个)
- (老师|教授|学生|无角色)
鉴于您只想要最后一组,(Teacher|Professor|Student|NoRole)
,其他 4 个组应标记为非捕获组。这是通过在左括号后添加 ?:
来完成的:
Given(/^I (?:\w{2})?\s?(?:log|login|logged)\s?(?:\w{2}) as (?:an|a) "(Teacher|Professor|Student|NoRole|Owner)"\.?$/)
请注意,user_role 组中缺少 "Owner" 角色(已在上面添加)。此步骤将匹配所有 5 个预期步骤。
这个问题有点离题,但是不要这样写步骤定义,这太痛苦了。 Cucumber 用户犯的最大错误之一是试图使步骤定义变干。您有多少步骤定义并不重要。重要的是步骤定义的内容是 DRY。您可以通过让它们调用辅助方法来做到这一点。
在你的情况下我会实施
Given "I am logged in as a teacher" do
login_as :teacher
end
and then implement
module LoginStepHelper
def login_as(user_type)
...
end
end
World LoginStepHelper
如果您有二十个不同的步骤定义调用此方法也没关系,因为您只有一个实现,所以如果您更改登录方式,您只需更改一件事。此外,您的步骤定义非常简单,您永远不会浪费时间调试特定语句不匹配的原因。
现在我很高兴拥有
Given "I am logged in as a teacher" do
login_as :teacher
end
Given "I log in as a teacher" do
login_as :teacher
end
Given "I am logged in as a artist" do
login_as :artist
end
...
是的,它可能有点乏味,但每一个都清晰简单,创建新的以满足新的语言使用是微不足道的,例如
Given "I am signed in as a artist" do
login_as :artist
end
将其与修改极其复杂的正则表达式的危险进行比较。
我有这些 .feature
陈述:
I am logged in as an "Teacher".
I am logged in as an "Professor".
I am logged in as an "Student".
I am logged in as a "NoRole"
为此我写了一个正则表达式
I (\w{2})?\s?(log|login|logged)\s?(\w{2}) as (an|a) "(Teacher|Professor|Student|NoRole)"\.?
我将它们放在引号中,这样我就可以 运行 像这样对它们进行 case 屏蔽:
case role_type
when 'Student'
on(LoginPage).login_with(FigNewton.Studnet_email,'password')
and so on ... for other roles
现在当我 运行 这个正则表达式在步骤定义中 Given
Given(/^I (\w{2})?\s?(log|login|logged)\s?(\w{2}) as (an|a) "(Teacher|Professor|Student|NoRole)"\.?$/) do |user_role|
# code
end
它给出了这个错误:
Cucumber::ArityMismatchError: Your block takes 1 argument, but the Regexp matched 5 arguments
查询:据我所知,参数是引号之间的参数,例如 "Professor" 所以它在谈论哪五个参数。
在这个Cucumber::ArityMismatchError error after Transform上我发现不应该有任何块,但是如果没有块我的regex
就不会工作,
那么如何将角色类型与 regex arguments(blocks)
如错误消息所述,步骤定义需要一个参数 - user_role
。但是,您捕获了 5 个组,这意味着您传递了 5 个参数:
- (\w{2})
- (登录|登录|登录)
- (\w{2})
- (一个|一个)
- (老师|教授|学生|无角色)
鉴于您只想要最后一组,(Teacher|Professor|Student|NoRole)
,其他 4 个组应标记为非捕获组。这是通过在左括号后添加 ?:
来完成的:
Given(/^I (?:\w{2})?\s?(?:log|login|logged)\s?(?:\w{2}) as (?:an|a) "(Teacher|Professor|Student|NoRole|Owner)"\.?$/)
请注意,user_role 组中缺少 "Owner" 角色(已在上面添加)。此步骤将匹配所有 5 个预期步骤。
这个问题有点离题,但是不要这样写步骤定义,这太痛苦了。 Cucumber 用户犯的最大错误之一是试图使步骤定义变干。您有多少步骤定义并不重要。重要的是步骤定义的内容是 DRY。您可以通过让它们调用辅助方法来做到这一点。
在你的情况下我会实施
Given "I am logged in as a teacher" do
login_as :teacher
end
and then implement
module LoginStepHelper
def login_as(user_type)
...
end
end
World LoginStepHelper
如果您有二十个不同的步骤定义调用此方法也没关系,因为您只有一个实现,所以如果您更改登录方式,您只需更改一件事。此外,您的步骤定义非常简单,您永远不会浪费时间调试特定语句不匹配的原因。
现在我很高兴拥有
Given "I am logged in as a teacher" do
login_as :teacher
end
Given "I log in as a teacher" do
login_as :teacher
end
Given "I am logged in as a artist" do
login_as :artist
end
...
是的,它可能有点乏味,但每一个都清晰简单,创建新的以满足新的语言使用是微不足道的,例如
Given "I am signed in as a artist" do
login_as :artist
end
将其与修改极其复杂的正则表达式的危险进行比较。