我有一个rspec规范:
require "spec_helper"
describe ApplicationHelper do
describe "#link_to_cart" do
it 'should be a link to the cart' do
helper.link_to_cart.should match /.*href="\/cart".*/
end
end
end
和ApplicationHelper:
module ApplicationHelper
def link_to_cart
link_to "Cart", cart_path
end
end
这在访问网站时有效,但规格因路由不可用的RuntimeError而失败:
RuntimeError:
In order to use #url_for, you must include routing helpers explicitly. For instance, `include Rails.application.routes.url_helpers
所以,我在我的规范中包含Rails.application.routes.url
,spec_helper
- 文件甚至是ApplicationHelper
本身,都无济于事。
编辑:我正在通过spork运行测试,可能与它有关并导致问题。
在使用Spork运行时,如何包含这些路线助手?
答案 0 :(得分:7)
您需要在include
的模块级别添加ApplicationHelper
,因为默认情况下ApplicationHelper不包含url帮助程序。像这样的代码
module AppplicationHelper
include Rails.application.routes.url_helpers
# ...
def link_to_cart
link_to "Cart", cart_path
end
end
然后代码将起作用,您的测试将通过。
答案 1 :(得分:4)
如果您将spork与rspec一起使用,则应将url_helper方法添加到rspec配置中 -
在'/ spec / spec_helper'文件中:
RSpec.configure do |config|
.
. =begin
. bunch of stuff here, you can put the code
. pretty much anywhere inside the do..end block
. =end
config.include Rails.application.routes.url_helpers
.
. #more stuff
end
这会加载一个名为“Routes”的内置ApplicationHelper,并将'#url_helpers'方法调用到RSpec中。无需将其添加到'/app/helpers/application_helper.rb'中的ApplicationHelper,原因有两个:
1)你只是将'routes'功能复制到一个不需要它的地方,本质上是控制器,它已经从ActionController :: Base继承了它(我想。也许:: Metal。现在不重要)。所以你不要干 - 不要重复自己
2)此错误特定于RSpec配置,将其修复到损坏的位置(我自己的小格言)
接下来,我建议稍微修改一下你的测试。试试这个:
require "spec_helper"
describe ApplicationHelper do
describe "#link_to_cart" do
it 'should be a link to the cart' do
visit cart_path
expect(page).to match(/.*href="\/cart".*/)
end
end
end
我希望这对某人有帮助!
答案 2 :(得分:0)
我在guard
使用spring
,我发现在我的情况下,问题是由春天造成的。运行spring stop
后,它已修复。但是当我改变ApplicationController
中的某些内容时,它会不断回归。