我如何摆脱@controller在我的testing是零误差

我不断收到

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

当我运行我的testing。 任何想法这是什么意思?

当您从ActionController :: TestCaseinheritance时,它会从testing名称推断控制器名称,如果它们不匹配,则必须使用testing的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 

我正在从轨道4的testing版升级到rspec 3的过程中,并遇到此错误。 结果问题是我们的控制器规范描述的是使用符号而不是string的语句。 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 

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

 @controller = PostController 

它应该是

 @controller = PostController.new 

否则你会得到一个错误:未定义的方法`response_body ='

或者,你可以简单地这样做:

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

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

检查你是否正在结束并正确结束。

 RSpec.describe LeadsController, type: :controller do # All tests should come here end