/rspec-example_steps

Given/When/Then steps for RSpec examples

Primary LanguageRubyMIT LicenseMIT

RSpec example steps

Given/When/Then/And/But steps for RSpec examples

Example

require 'rspec/example_steps'

context "Searching" do
  Steps "Result found" do
    Given "I am on search page" do
      page.visit("/search")
      page.should have_content("Search")
    end

    When "I search something" do
      page.fill_in('Search', :with => 'John')
      page.click_button "Go"
    end

    Then "I should see result" do
      page.should have_content("Result")
    end
  end
end

Documentation formatting output:

Searching
  User succesfully replaces device
    Given I am on search page
    When I search something
    Then I should see result

Shared steps

Use shared_steps do define block that will be evaluated in the context of example using include_steps.

Shared steps behavior is simular to shared example but context is example nor example_group.

Example with shared steps

shared_steps "login" do
  When "I go to login page" do
    page.visit '/login'
  end
  When "I put credentials" do
    page.fill_in 'Login', :with => 'jack@example.com'
    page.fill_in 'Password', :with => 'password''
  end
  Then "I should be logged in" do
    page.status_code.should == 200
    page.should have_content("Welcome jack@example.com")
  end
end

shared_steps "logout" do
  page.visit '/logout'
  page.status_code.should == 200
end

context "user flow"
  Steps "User updates profile description" do
    include_steps "login"
    When "I update profile description" do
      ...
    end
    include_steps "logout"
  end

  Steps "User updates profile avatar" do
    include_steps "login"
    When "I update profile avatar" do
      ...
    end
    include_steps "logout"
  end
end

Passing arguments to shared steps

It's possible to customize shared steps. See example

Example with shared steps with arguments

shared_steps "login" do |email, password|
  When "I go to login page" do
    page.visit '/login'
  end
  When "I put credentials" do
    page.fill_in 'Login', :with => email
    page.fill_in 'Password', :with => password
  end
end

shared_steps "invalid login" do
  Then "I should see login error" do
  ...
  end
end

Steps "User provides wrong email" do
  include_steps "login", 'jack', 'qwerty'
  include_steps "invalid login"
end

Steps "User provides wrong password" do
  include_steps "login", 'jack@example.com', 'bla'
  include_steps "invalid login"
end

Pending steps

Simular to Example :pending behavior:

Steps "User login" do
  # just skip block
  When "I go to login"

  # pass :pending => true option
  Then "I should see welcome", :pending => true do
...
  end

  # pass :pending => "some pending message"
  Then "I should see last login IP", :pending => "WIP" do
...
  end
end

License

Alternatives