我一直在
@controller is nil: make sure you set it in your test's setup method.
当我运行我的测试时。知道这意味着什么吗?
答案 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)
在 Rails 6 中看起来是这样的:
img
答案 7 :(得分:0)
我遇到这个错误是因为我用引号将控制器名称括起来了。
# broken
RSpec.describe 'RegistrationsController', type: :controller do
...
end
# works
RSpec.describe RegistrationsController, type: :controller do
...
end