如何在我的测试中摆脱@controller是nil错误

时间:2011-10-12 16:05:19

标签: ruby-on-rails ruby-on-rails-3

我一直在

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

当我运行我的测试时。知道这意味着什么吗?

8 个答案:

答案 0 :(得分:80)

当你继承ActionController :: TestCase时,它会从测试名称中推断出控制器名称,如果它们不匹配,你必须使用test的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

答案 1 :(得分:14)

我正在从rails 4上的beta版升级到rspec 3并遇到此错误。问题是我们的Controller规范描述了使用符号而不是字符串的语句。 Rspec试图将符号实例化为控制器,但实际上它们是&#39;动作&#39;。

#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

答案 2 :(得分:11)

ErsatzRyan的回答是正确的,但是有一个小错字。而不是

@controller = PostsController

应该是

@controller = PostsController.new

否则会出现错误:未定义的方法`response_body ='

答案 3 :(得分:2)

如果名称匹配,并且@controller变量仍为nil,请尝试检查控制器实例化中的错误。对我来说,我有一个控制器初始化方法,其中有一个错误。出于某种原因,控制器在测试中只是零,而不是在没有实例化时抛出错误。

答案 4 :(得分:1)

或者,您可以这样做:

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

答案 5 :(得分:1)

检查是否正在结束操作并正确结束。

RSpec.describe LeadsController, type: :controller do

   # All tests should come here

end

答案 6 :(得分:0)

答案 7 :(得分:0)

我遇到这个错误是因为我用引号将控制器名称括起来了。

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

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