我在一个全新的Rails 5项目中使用简单的rspec控制器测试遇到了一个大问题
这是我的routes.rb
Rails.application.routes.draw do
get '/foo', to: 'application#foo'
get '/bar', to: 'application#foo'
end
这是我的ApplicationController.rb
class ApplicationController < ActionController::Base
def foo
render html: 'foo', status: 200
end
def bar
render html: 'bar', status: 200
end
end
如果我使用rails s
启动服务器,我可以访问/foo
和/bar
个端点,并查看正确的foo
html页面。
然而,当我运行这个rspec:
ENV['RAILS_ENV'] = 'test'
require File.expand_path('../../config/environment', __dir__)
require 'rspec/rails'
RSpec.describe ApplicationController, type: :controller do
it 'can get foo' do
get 'foo'
end
it 'can get bar' do
get 'bar'
end
end
此输出的测试失败:
1) ApplicationController can get bar
Failure/Error: get 'bar'
ActionController::UrlGenerationError:
No route matches {:action=>"bar", :controller=>"application"}
为什么我的浏览器可以在没有rspec找到我的/ bar路径?
奇怪的是,如果我在routes.rb文件中更改该路由以使用条形码操作:
get '/bar', to: 'application#bar'
突然rspec可以找到路线,测试通过......
我需要对我的路线使用任意操作,因此符合此模式以满足rspec不是一种选择。我怎样才能让rspec工作?
答案 0 :(得分:1)
将您的控制器规范更改为请求规范,这是在RSpec 3.5中测试Rails中控制器的首选方法
由于您在原始配置中没有绑定到URL的#bar
操作,因此您收到该错误。因此,当规范执行#bar
时,该操作没有URL。
控制器规范不像你想象的那样工作;没有任何尝试请求您指定的路径。相反,它正在执行您在#bar
操作中编写的代码,并从响应中提取URL。
要缓解此问题,您可以将规范type:
更改为:request
而不是:controller
。
然后你可以这样做:
RSpec.describe ApplicationController, type: :request do
it 'can get foo' do
get '/foo'
end
it 'can get bar' do
get '/bar'
end
end
答案 1 :(得分:0)
您是否尝试过在浏览器中访问此路径(get '/bar', to: 'application#foo'
)?