RSpec example steps

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

Description

This gem brings two major functionality to your spec/features

  • Verbosity for rspec documentation formatter.
  • Ability to comment or describe set of actions in example into some step.

Installation

  • For rspec v2 use gem v0.2.x or rspec2 branch
  • For rspec v3 user gem v3.x.x or master branch
gem 'rspec-example_steps'

Add to spec/spec_helper.rb

require 'rspec/example_steps'

Example

spec/features/search_spec.rb

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

    When 'I search something' do
      fill_in 'Search', with: 'John'
      click_button 'Go'
    end

    Then 'I should see result' do
      expect(page).to have_content('Result')
    end
  end
end

Documentation formatting output:

rspec -fd spec/features/search_spec.rb


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
    visit '/login'
  end
  When 'I put credentials' do
    fill_in 'Login', with: '[email protected]'
    fill_in 'Password', with: 'password'
  end
  Then 'I should be logged in' do
    expect(page).to have_content('Welcome [email protected]')
  end
end

shared_steps 'logout' do
  visit '/logout'
  expect(page.status_code).to eq(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
    fill_in 'Login', with: email
    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', '[email protected]', '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

Authors

License

Alternatives