RSpec控制器.在Rails 6.1升级后,controller_name为空



升级到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

的提交

相关内容

  • 没有找到相关文章

最新更新