升级到Rails 6.1后,RSpec 3.11.0的测试助手规范似乎被打破了:
# helpers/my_helper.rb
module MyHelper
def foobar
controller.controller_name.to_sym
end
end
我的测试是这样的
# spec/helpers/my_helper_spec.rb
describe MyHelper do
it "foo" do
expect(foobar).to eq(:test)
end
end
并抛出这个错误
1) MyHelper foo
Failure/Error: controller.controller_name.to_sym
NoMethodError:
undefined method `to_sym' for nil:NilClass
# ./app/helpers/my_helper.rb:5:in `foobar'
在升级到Rails 6.0之前,controller.controller_name
只是设置为"test"
,但现在是nil
。
我现在必须显式设置控制器名称吗?
我不是100%确定这将解决您的问题,但尝试将type: :helper
添加到您的describe
语句:
describe MyHelper, type: :helper do
it "foo" do
expect(foobar).to eq(:test)
end
end
我发现了这是怎么回事,比较这两行:
https://github.com/rails/rails/blob/v6.0.5/actionview/lib/action_view/test_case.rb L104
@controller = ActionView::TestCase::TestController.new
https://github.com/rails/rails/blob/v6.1.6/actionview/lib/action_view/test_case.rb L105
controller_class = Class.new(ActionView::TestCase::TestController)
在Rails 6.1中,controller_class
是一个没有名字的匿名类。因为controller.controller_name
使用类名,所以它返回nil
。我解决了这个问题,像这样:
allow(controller).to receive(:controller_name).and_return("test")
然而,这个决定背后的原因会很有趣。也许他们希望测试更明确地显示控制器名称。这是修改了那行https://github.com/rails/rails/commit/3ec8ddd0cf3851fd0abfc45fd430b0de19981547
的提交