Подтвердить что ты не робот

Как избавиться от @controller - это ошибка в моих тестах

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Я был в процессе обновления до rspec 3 из бета-версии на рельсах 4 и столкнулся с этой ошибкой. Проблема оказалась в том, что наша спецификация Controller описывает выражения, используемые вместо символов. 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

Ответ 3

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

@controller = PostController

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

@controller = PostController.new

иначе вы получите сообщение об ошибке: undefined method `response_body = '

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

RSpec.describe LeadsController, type: :controller do

   # All tests should come here

end