Reuse Cucumber steps

cucumber, ruby, testing

Solution

UPDATE: The method described below has been deprecated. The recommended way to call a step from within another step now looks like this:

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

Old, deprecated method (for reference):

You can call steps from other steps like this:

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

If all of the scenarios within a feature require this (or other steps), you can also add a Background to each features, with the common steps, like so:

Background:
  Given I log in with valid credentials

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

Problem

I want to reuse some Cucumber steps but can't seem to find the right way. I want to write a step like: ``` Given /^I login with (.*) credentials$/ |type| # do stuff with type being one of "invalid" or "valid" end ``` But then have another step like: ``` Given /^I login successfully$ # call "Given I login with valid credentials" end ``` So in testing user authentication I can use the former, but most other places, I can use the latter, and not actually have to repro code. Is there a way to call that other step, or do I just put the logic in a helper method, and call said method from each task (basically a method extraction refactoring, which, after reading my question makes me believe that's actually the best way anyway)?

Original source