#ruby-on-rails #rspec
#ruby-on-rails #rspec
Вопрос:
Я тестирую свой employees_controller, и в моем тестировании индекса для пользователей, вошедших в систему, я получаю ошибку, которая, по-видимому, связана с моими отношениями с моделями.
Тест является:
describe "for signed-in user" do
before(:each) do
@user = test_sign_in(Factory(:user))
end
it "should have the right title" do
get :index
response.should have_selector('title', :content => "Employee List")
end
У меня установлены render_views. У меня также каждый пользователь привязан к местоположению, и представление индекса сотрудника должно показывать сотрудников для местоположения пользователя. И в моем представлении индекса у меня есть следующий код, чтобы показать название местоположения сотрудников:
<h1>Listing employees for <%= current_user.location.name %> </h1>
Когда я запускаю свой тест, я получаю сообщение об ошибке, которое содержит
«ActionView::Template::Ошибка:
неопределенное имя метода для nil:NilClass»
В моем файле factories.rb я установил идентификатор местоположения пользователя в допустимый идентификатор. Почему current_user.location возвращает nil? Чего мне не хватает в тесте? Спасибо!
Ответ №1:
Скорее всего, это просто неправильный процесс входа в систему. Вот как я это делаю. У меня есть / spec / support /controller_macros.rb и внутри :
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = :user
@user = Factory(:user)
sign_in @user
end
end
end
Теперь, в моих спецификациях контроллера :
describe AbilitiesController do
login_user
describe "POST 'train' ..." do
...
end
...
Комментарии:
1. У меня действительно был макрос входа в вспомогательный файл спецификации. Что делает @request.env[«devise.mapping»] = :user в вашем макросе login_user?
2. я действительно не знаю, что это делает (и меня это не особо волнует), но именно так это использует официальная devise wiki.