Cucumber changes the cost-benefit ratio. With Cucumber and Rails, the cost of maintaining the fixtures is so low that I no longer bother writing conventional Rails controller and integration tests. For any testing at the controller level and up, I use Cucumber.
Here's a conventional Rails integration test:
class UserStoriesTest < ActionController::IntegrationTest
context "A user" do
setup do
@admin = Factory.create(:user, :is_admin => true)
@non_admin = Factory.create(:user,
:is_admin => false)
end
should "be able to login as an admin and set another user to be admin" do
user = regular_user
user.logs_in_as(@admin)
user.views_users
user.edits_user(@non_admin)
user.makes_user_an_admin(@non_admin)
non_admin = User.find_by_id(@non_admin.id)
assert non_admin.is_admin?
end
end
def regular_user
open_session do |user|
def user.edits_user(user_edited)
get "/admin/users/#{user_edited.id}/edit"
assert_response :success
assert_template 'admin/users/edit'
end
def user.logs_in_as(user_login)
get '/login'
assert_response :success
assert_template 'user_sessions/new'
post_via_redirect '/user_sessions/create',
:user_session => {
:email => user_login.email,
:password => user_login.password }
assert_response :success
assert_template 'posts/index'
end
def user.makes_user_an_admin(user_updated)
post_via_redirect "/admin/users/update",
:id => user_updated.id,
:user => { :is_admin => true }
assert_response :success
assert_template 'admin/users/index'
end
def user.views_users
get '/admin/users'
assert_response :success
assert_template 'admin/users/index'
end
end
end
end
Here's the Cucumber equivalent:
Scenario: Set non-admin user to admin Given a user is logged in as admin And a non-admin user "Peter" When I go to the list of users And I fill in "search" with "Peter" And I press "Search" And I follow "Edit" Then I should see "Peter" And the "Is Admin" checkbox should not be checked When I check "Is Admin" And I press "Save" And I go to the list of users And I fill in "search" with "Peter" And I press "Search" And I follow "Edit" Then I should see "Peter" And the "Is Admin" checkbox should be checked
Reference: