开发者

How do i get rid of @controller is nil error in my tests

I keep getting

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

Whe开发者_运维知识库n I run my tests. Any idea what this means?


when you inherit from ActionController::TestCase it infers the controller name from the test name if they do not match you have to use the setup part of test to set it.

So if you have

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

Then @controller is auto instantiated to PostsController, however, if this were not the case and you had a different name you would need a setup as such

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


I was in the process of upgrading to rspec 3 from the beta version on rails 4 and ran into this error. The problem turned out to be that our Controller spec describe statements used symbols instead of strings. Rspec was attempting to instantiate the symbol as the controller but they were in fact 'actions'.

#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


ErsatzRyan answer is correct, however there is a small typo. Instead of

@controller = PostsController

it should be

@controller = PostsController.new

otherwise you get an error: undefined method `response_body='


Check whether you are ending the do and end properly.

RSpec.describe LeadsController, type: :controller do

   # All tests should come here

end


If the names match, and the @controller variable is still nil, try checking for errors in the controller instantiation. For me I had a controller initialize method that had a bug in it. For some reason the controller was just nil in the test, rather than throwing an error when it wasn't instantiated.


Or, you can simply do this:

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


In Rails 6 looks like it is like this:

tests PostController
  • https://www.rubydoc.info/docs/rails/4.1.7/ActionController/TestCase#label-Controller+is+automatically+inferred


I encountered this error because I surrounded the controller name in quotes.

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

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜