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

mon*_*ike 48 ruby-on-rails ruby-on-rails-3

我一直在

 @controller is nil: make sure you set it in your test's setup method.
Run Code Online (Sandbox Code Playgroud)

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

Ers*_*yan 82

当你继承ActionController :: TestCase时,如果它们不匹配,它会从测试名称中推断出控制器名称,你必须使用setuptest 的一部分来设置它.

所以,如果你有

class PostsControllerTest < ActionController::TestCase
  def test_index
    #assert something
  end
end
Run Code Online (Sandbox Code Playgroud)

然后@controller是自动实例化PostsController,但是,如果不是这种情况,并且您有一个不同的名称,则需setup要这样做

class SomeTest < ActionController::TestCase
  def setup
    @controller = PostController.new
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,你带我去解决了.我正在使用描述"UsersController"做....我删除了引号,它解决了问题(命名是问题). (3认同)
  • 如果您的控制器有一个类似`Api ::`的模块,那么您的测试和文件结构也需要包含该模块:`test/controllers/api/posts_controller.rb`和`Api :: PostsController <ActionController :: TestCase` (3认同)

小智 15

我正在从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
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢这个答案.我遇到了同样的问题. (2认同)

cha*_*deb 11

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

@controller = PostsController
Run Code Online (Sandbox Code Playgroud)

它应该是

@controller = PostsController.new
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,我认为你需要使用复数,因为它是一个控制器.所以UsersController.new或PostsController.new (3认同)