Как мне избавиться от ошибки @controller is nil в моих тестах

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

Я продолжаю получать

  @controller is nil: make sure you set it in your test's setup method.
  

Когда я запускаю свои тесты. Есть идеи, что это значит?

Ответ №1:

когда вы наследуете от ActionController::TestCase, он выводит имя контроллера из имени теста, если они не совпадают, вам нужно использовать setup часть test для его установки.

Итак, если у вас есть

 class PostsControllerTest < ActionController::TestCase
  def test_index
    #assert something
  end
end
  

Затем @controller автоматически создается экземпляр PostsController , однако, если бы это было не так, и у вас было другое имя, вам понадобился бы setup как таковой

 class SomeTest < ActionController::TestCase
  def setup
    @controller = PostController.new
  end
end
  

Комментарии:

1. спасибо, вы привели меня к решению. Я использовал описание «UsersController» do…. Я удалил кавычки, и это решило проблему (проблема заключалась в именовании).

2. Если у ваших контроллеров есть модуль, подобный Api:: , то ваши тесты и файловая структура также должны включать модуль: test/controllers/api/posts_controller.rb и Api::PostsController < ActionController::TestCase

3. Я уже знал этот ответ, но поскольку я был уверен, что написал его правильно, я просмотрел ошибку, чтобы посмотреть, что еще может вызвать это. Ваш ответ побудил меня еще раз проверить правописание. Рассказчик: Это было не правильно написано.

Ответ №2:

Я находился в процессе обновления до rspec 3 с бета-версии на rails 4 и столкнулся с этой ошибкой. Проблема оказалась в том, что в наших операторах описания спецификации контроллера вместо строк использовались символы. Rspec пытался создать экземпляр символа в качестве контроллера, но на самом деле это были «действия».

 #trys to set @controller = Index.new
describe SomeController do
  describe :index do
    before do
      get :index, format: :json
    end
    it { expect(response).to be_success}
  end
end

#works
describe SomeController do
  describe 'index' do
    before do
      get :index, format: :json
    end
    it { expect(response).to be_success}
  end
end
  

Комментарии:

1. Большое спасибо за этот ответ. У меня была такая же проблема.

Ответ №3:

Ответ ErsatzRyan правильный, однако есть небольшая опечатка. Вместо

 @controller = PostsController
  

это должно быть

 @controller = PostsController.new
  

в противном случае вы получите сообщение об ошибке: неопределенный метод `response_body=’

Комментарии:

1. на самом деле, я думаю, вам нужно использовать множественное число, поскольку это контроллер. Итак, UsersController.new или PostsController.new

Ответ №4:

Проверьте, правильно ли вы завершаете do и end.

 RSpec.describe LeadsController, type: :controller do

   # All tests should come here

end
  

Ответ №5:

Если имена совпадают, а переменная @controller по-прежнему равна нулю, попробуйте проверить наличие ошибок при создании экземпляра контроллера. У меня был метод инициализации контроллера, в котором была ошибка. По какой-то причине контроллер был просто нулевым в тесте, вместо того, чтобы выдавать ошибку, когда он не был создан.

Ответ №6:

Или вы можете просто сделать это:

 RSpec.describe PostsControllerTest, :type => :controller do
  # ...
end
  

Ответ №7:

Ответ №8:

Я столкнулся с этой ошибкой, потому что я заключил имя контроллера в кавычки.

 # broken
RSpec.describe 'RegistrationsController', type: :controller do
...
end

# works
RSpec.describe RegistrationsController, type: :controller do
...
end