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

将其与修改极其复杂的正则表达式的危险进行比较。