2013-04-30 3 views
1

Я новичок в Rails. Я использую FactoryGirl для создания пользователей для моих интеграционных тестов, и я не могу понять, как подписать моего пользователя в тесте.NoMethodError: undefined method `sign_in_as! ', FactoryGirl, Rspec, Rails

Моя фабрика выглядит следующим образом:

FactoryGirl.define do 
    factory :user do 
     sequence(:email) { |n| "user#{n}@ticketee.com" } 
     password "password" 
     password_confirmation "password" 
    end 

    factory :confirmed_user do 
     after_create { |user| user.confirm! } 
    end 
end 

И мой тест выглядит следующим образом:

feature 'Editing an exercise' do 

    before do 
     ex = FactoryGirl.create(:ex) 
     user = FactoryGirl.create(:user) 
     user.confirm! 
     sign_in_as!(user) 
    end 

    scenario 'can edit an exercise' do 
     visit '/' 
     click_link 'Exercises' 
     click_link 'running' 
     click_link 'edit' 
     fill_in 'Name', :with => 'kick boxing' 
     fill_in 'Description', :with => 'kicking a box' 
     click_button 'Save' 
     page.should have_content('Exercise updated!') 
     page.should have_content('kick boxing') 
    end 
end 

Когда я запускаю тест я получаю ошибку:

Failure/Error: sign_in_as!(user) 
NoMethodError: 
undefined method `sign_in_as!' 
for #<RSpec::Core::ExampleGroup::Nested_1:0xb515ecc> 

В приложение отлично работает, это только испытание, которое терпит неудачу. Любая помощь будет оценена по достоинству. Благодаря!

ответ

0

где sign_in_as! определены? Мне кажется, что он определен в ApplicationController и поэтому недоступен в вашем тесте.

Вы, вероятно, уже есть интеграционный тест для входа в систему вашего пользователя, что-то вроде этого:

scenario "user logs in" do 
    visit '/' 
    fill_in "Username", with: "username" 
    ... 
end 

Если это так, вы должны быть в состоянии вытащить большую часть кода в вспомогательный метод и использования что в вашем блоке перед

Edit: Я только сейчас понял, вы, вероятно, с помощью Завещание, в этом случае вы должны изменить свой spec_helper.rb так:

RSpec.configure do |c| 
    ... 
    c.include Devise::TestHelpers 
    ... 
end 

и используйте sign_in вместо sign_in_as!

+1

Да, я использую Devise. Я добавил c.include Devise :: TestHelpers в свой файл spec_helper, и теперь ошибка: Failure/Error: sign_in (пользователь) NoMethodError: undefined method 'env 'для nil: NilClass –

+0

Я прочитал документацию разработчика по Github http: //github.com/plataformatec/devise снова. В сегменте тестовых помощников указано, что Devise не предоставляет никаких помощников для интеграционных тестов. Кажется, что нужно создать/реорганизовать тест «пользовательские журналы», как я и предложил. –

1

Вы были правы, мой тест не смог найти sign_in_as !, и я закончил писать помощник аутентификации, который выглядит следующим образом:

module AuthenticationHelpers 
    def sign_in_as!(user) 
     visit '/users/sign_in' 
     fill_in "Email", :with => user.email 
     fill_in "Password", :with => "password" 
     click_button "Sign in" 
     page.should have_content("Signed in successfully.") 
    end 
end 

RSpec.configure do |c| 
    c.include AuthenticationHelpers, :type => :request 
end 

и приклеить его в спецификации/поддержка/authentication_helpers.rb. Это сработало. Спасибо за помощь!

Смежные вопросы