重复使用黄瓜步骤

我想重用一些黄瓜步骤,但似乎无法找到正确的方法。

我想写一个像这样的步骤:

Given /^I login with (.*) credentials$/ |type|
  # do stuff with type being one of "invalid" or "valid"
end

但是,接下来会有另一个步骤:

Given /^I login successfully$
  # call "Given I login with valid credentials"
end

所以在测试用户身份验证时我可以使用前者,但大多数其他地方,我可以使用后者,而实际上并不需要重新编码。

有没有办法调用另一个步骤,或者我只是将逻辑放在一个辅助方法中,然后从每个任务调用所述方法(基本上是一种方法提取重构,在阅读我的问题之后,我相信这实际上是最好的方法无论如何)?


更新 :下面描述的方法已被弃用。 从另一个步骤中调用步骤的推荐方式现在看起来像这样:

Given /^I login successfully$/
    step "I login with valid credentials" 
end 

旧的,弃用的方法(供参考):

您可以从以下其他步骤调用步骤:

Given /^I login successfully$/
  Given "I login with valid credentials"
  Then "I should be logged in"
end

如果某个功能中的所有场景都需要此功能(或其他步骤),则还可以使用常用步骤为每个功能添加一个背景,如下所示:

Background:
  Given I log in with valid credentials

Scenario: Change my password
  Given I am on the account page

请注意,在最近版本的黄瓜中,调用步骤中步骤的方法已经发生了变化,您会看到如果出现如下错误:“警告:在步骤定义中使用'Given / When / Then'已被弃用,请使用'step'请改用其他步骤:/path/to/step_definitions/foo_steps.rb:631:在`block in'“中。 有关详细信息,请参阅黄瓜wiki。

改变的要点是你现在应该使用stepsteps方法。

When /^I make all my stuff shiny$/
  step "I polish my first thing"
end

When /^I make all my stuff shiny$/
  steps %Q{
    When I polish my first thing
    When I shine my second thing
  }
end

从步骤定义调用步骤是一种不好的做法,并且存在一些缺点:

  • 如果场景失败并且存在嵌套的步骤调用,则只会获取堆栈跟踪中上次调用的步骤定义。 可能很难找到最后一个stepdef被调用的地方
  • 打电话给stepdef有时比ruby方法更难找到和阅读
  • Ruby方法比从step defs调用步骤给你更多的能力
  • AslakHellesøy建议将流行的操作提取到世界,而不是重复使用步骤。 它将这些操作隔离在一个地方,使代码更容易找到。 您可以将代码提取到常见的Ruby类或模块中。

    #/support/world_extensions.rb
    module KnowsUser
      def login
        visit('/login')
        fill_in('User name', with: user.name)
        fill_in('Password', with: user.password)
        click_button('Log in')
      end
    
      def user
        @user ||= User.create!(:name => 'Aslak', :password => 'xyz')
      end
    end
    World(KnowsUser)
    
    #/step_definitions/authentication_steps.rb
    When /^I login$/ do
      login
    end
    
    Given /^a logged in user$/ do
      login
    end
    

    以下是关于Cucumber邮件列表中的主题的有用讨论 - 链接

    链接地址: http://www.djcxy.com/p/38779.html

    上一篇: Reuse Cucumber steps

    下一篇: Initialize': getaddrinfo: Name or service not known (SocketError