Ruby on rails Can';带rspec的t测试控制器

Ruby on rails Can';带rspec的t测试控制器,ruby-on-rails,rspec,routes,ruby-on-rails-5,rspec-rails,Ruby On Rails,Rspec,Routes,Ruby On Rails 5,Rspec Rails,在一个全新的Rails 5项目中,我在简单的rspec控制器测试中遇到了一个大问题 这是我的路线 Rails.application.routes.draw do get '/foo', to: 'application#foo' get '/bar', to: 'application#foo' end 这是我的ApplicationController.rb class ApplicationController < ActionController::Base def

在一个全新的Rails 5项目中,我在简单的rspec控制器测试中遇到了一个大问题

这是我的路线

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
此输出导致测试失败:

1) ApplicationController can get bar
 Failure/Error: get 'bar'

 ActionController::UrlGenerationError:
   No route matches {:action=>"bar", :controller=>"application"}
当我的浏览器可以找到我的/酒吧路线时,为什么rspec找不到

奇怪的是,如果我在routes.rb文件中更改该路由以使用bar操作:

get'/bar',to:'application#bar'

突然rspec找到了路线,测试通过了


不过,我需要对我的路由使用任意操作,因此遵循此模式以满足rspec不是一个选项。如何让rspec工作?

您是否尝试过在浏览器中访问此路径(
get'/bar',到:'application#foo'
)吗?

将控制器规范更改为请求规范,这是自rspec 3.5起在Rails中测试控制器的首选方法

由于在原始配置中没有将
#bar
操作绑定到URL,因此会出现该错误。因此,当规范执行
#bar
时,该操作没有URL

控制器规范并不像你想象的那样工作;没有任何东西试图请求您指定的路径。相反,它执行您在
#bar
操作中编写的代码,并从响应中提取URL

为了缓解这种情况,您可以将规格
类型:
更改为
: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

太好了,thnx!我试图复制一些使用旧版本rspec的回购协议
RSpec.describe ApplicationController, type: :request do
  it 'can get foo' do
    get '/foo'
  end

  it 'can get bar' do
    get '/bar'
  end
end