我认为我的gem测试要运行的虚拟应用程序没有正确设置,因为当我在gem的帮助器中的Gadget实例(来自虚拟应用程序的存根模型)上调用url_for
时,我得到了
undefined method `gadgets_path' for #<#<Class:0x007fe274bc1228>:0x007fe273d45eb0>
背景:我分叉了一个宝石并做了一些重大改变。 (Here's the fork。)现在我正在尝试使rspec测试工作,以便我可以验证我的更新。
测试设置类似于Rails引擎,在spec
目录中有一个虚拟应用程序。该应用程序有一个模型(Gadget
),其中包含适当的控制器和spec/dummy/environment/routes.rb
文件中声明的资源:
Dummy::Application.routes.draw do
resources :gadgets
end
spec/spec_helper.rb
文件如下所示:
ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../dummy/config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
RSpec.configure do |config|
config.mock_framework = :rspec
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.infer_base_class_for_anonymous_controllers = false
config.order = "random"
config.include Rails.application.routes.url_helpers
end
(您实际上可以在the project's github repo中看到完整的测试设置。我实际上在大约一周前打开了an issue,但现在我才开始试图解决它。)< / p>
一个未挂起的测试会创建一个Gadget实例,然后使用该实例作为参数调用该帮助器。当帮助程序尝试url_for(@gadget)
时,它会触发上述错误。
这里有什么问题?
ETA Dec 04:更新了当前的spec_helper.rb
。
答案 0 :(得分:10)
<强>更新强>
把它放在你的spec_helper.rb里面 - 至少这对我有用(我克隆你的回购)
ActionView::TestCase::TestController.instance_eval do
helper Rails.application.routes.url_helpers#, (append other helpers you need)
end
ActionView::TestCase::TestController.class_eval do
def _routes
Rails.application.routes
end
end
真正的问题是TestController
是在使用路径辅助方法扩展 ActionController::Base
之前从ActionController::Base
创建的子类。
所以你需要将它注入TestController
。此外,AbstractController :: UrlFor需要实现_routes
。
为了使用路由助手,您应该插入
Rspec.configure do |config|
config.include Rails.application.routes.url_helpers
...
end
您的spec_helper.rb中的可使所有something_path
方法可用。
另一种方式围绕真正的问题将是如此强制执行帮助:
helper.stub!(:url_for).and_return("/path")
答案 1 :(得分:1)
虽然这需要相当多的源代码,但在我看来,您正在调用editable_field
,而url_for
又会调用url_for
。但是{{1}}只能在控制器的上下文中工作,而你只是在规范的中间调用它。
因此,或许将此方法存根或进行集成测试可能是一种合适的解决方法。