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

我不断

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

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

montrealmike asked 2020-02-21T02:49:03Z
6个解决方案
81 votes

当您从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
ErsatzRyan answered 2020-02-21T03:01:44Z
15 votes

我正在从Rails 4的beta版升级到rspec 3的过程中,遇到了此错误。 问题出在我们的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
Kevin B answered 2020-02-21T03:02:04Z
11 votes

ErsatzRyan的答案是正确的,但是有一个小的错字。 代替

@controller = PostsController

它应该是

@controller = PostsController.new

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

charlesdeb answered 2020-02-21T03:02:33Z
2 votes

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

Nathan Hanna answered 2020-02-21T03:02:54Z
1 votes

或者,您可以简单地执行以下操作:

RSpec.describe PostsControllerTest, :type => :controller do
  # ...
end
tokhi answered 2020-02-21T03:03:14Z
1 votes

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

RSpec.describe LeadsController, type: :controller do

   # All tests should come here

end
answered 2020-02-21T03:03:34Z
translate from https://stackoverflow.com:/questions/7743059/how-do-i-get-rid-of-controller-is-nil-error-in-my-tests