Ошибка Rspec — взаимосвязь между текущим пользователем и другой моделью

#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.