#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:
В Rails 6 выглядит так:
tests PostController
Ответ №8:
Я столкнулся с этой ошибкой, потому что я заключил имя контроллера в кавычки.
# broken
RSpec.describe 'RegistrationsController', type: :controller do
...
end
# works
RSpec.describe RegistrationsController, type: :controller do
...
end