无法使用rspec测试控制器

时间:2018-04-10 23:22:27

标签: ruby-on-rails rspec routes ruby-on-rails-5 rspec-rails

我在一个全新的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工作?

2 个答案:

答案 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')?