4

我认为运行我的 gem 测试的虚拟应用程序设置不正确,因为当我url_for在 gem 的帮助程序中调用 Gadget 实例(来自虚拟应用程序的存根模型)时,我得到

undefined method `gadgets_path' for #<#<Class:0x007fe274bc1228>:0x007fe273d45eb0>

背景:我分叉了一个 gem 并进行了一些重大更改。(这是叉子。)现在我正在尝试使 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

(实际上,您可以在项目的 github 存储库中看到完整的测试设置。我实际上在一周左右之前为此打开了一个问题,但直到现在我才开始尝试解决它。​​)

一个未挂起的测试会创建一个 Gadget 实例,然后以它作为参数调用助手。当助手尝试url_for(@gadget)时,它会触发上述错误。

这里有什么问题?

ETA 12 月 4 日:更新为当前的spec_helper.rb.

4

2 回答 2

11

更新

把它放在你的 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

真正的问题是,TestControllerActionController::Base 以前 ActionController::Base继承的子类是用路由辅助方法扩展的。
所以你需要将它注入到TestController. _routes此外,还需要实现AbstractController::UrlFor 。


为了使用路由助手,您应该插入

Rspec.configure do |config|
  config.include Rails.application.routes.url_helpers
  ...
end

在您的 spec_helper.rb 中,它使所有something_path方法都可用。解决实际问题的另一种方法是像这样删除助手:

helper.stub!(:url_for).and_return("/path")
于 2012-12-04T13:39:46.610 回答
1

虽然这是相当多的源代码,但在我看来,您正在调用editable_field它,而后者又调用了url_for. 但是url_for只能在控制器的上下文中工作,而您只是在规范的中间调用它。

因此,也许将这种方法存根或进行集成测试将是一个合适的解决方法。

于 2012-12-04T12:01:03.490 回答