rspec测试中的UrlGenerationError

时间:2017-02-17 20:38:04

标签: ruby-on-rails-4 rspec-rails rails-routing

我的任务是创建与我们的应用程序一致的自定义错误页面。我发现https://wearestac.com/blog/dynamic-error-pages-in-rails完全正常。我没有收到任何路由错误,并且手动测试显示每个页面都正确呈现。

但是,在为用于将路由委派给视图的控制器创建控制器规范时,我遇到了一个问题。我的观看次数为404.html.erb500.html.erb422.html.erb。它们位于app/views。我的代码几乎与上面链接中列出的内容完全相同,但是为了后人和清晰度,相关代码如下所示,错误消息如下所示:

错误讯息:ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"errors", :params=>{:code=>"404"}}

应用程序/控制器/ errors_controller.rb:

# frozen_string_literal: true
class ErrorsController < ApplicationController
  def show
    render status_code.to_s, status: status_code
  end

  protected

  # get status code from params, default 500 in cases where no error code
  def status_code
    params[:code] || 500
  end
end

规格/控制器/ errors_controller_spec.rb:

require 'rails_helper'

describe ErrorsController, type: :controller do

    describe '#show' do
      it 'renders the 404 error page when it receives a 404 status code' do
      get :show, params: { code: '404' }
      # ive also tried changing the param passed to redirect_to to error_404 to no effect
      expect(response).to redirect_to(error_404_path)
    end

    it 'renders the 422 error page when it receives a 422 status code' do
      get :show, params: { code: '422' }
      expect(response).to redirect_to(error_422_path)
    end

    it 'renders the 500 error page when it receives a 500 status code' do
      get :show, params: { code: '500' }
      expect(response).to redirect_to(error_500_path)
    end
  end
end

config / routes.rb(只有相关路线,我们的完整路线文件是巨大的)

%w(404 422 500).each do |code|
  get code, to: "errors#show", code: code, as: 'error_' + code
end

config / application.rb(只有相关的行,其他一切都是标准的):

config.exceptions_app = self.routes

我尝试过扩展路由,以便明确定义每个路由,以及恢复到链接中的第一个非DRY表单。我也尝试将redirect_to来电更改为render_template来电,但没效果。

我已经抓了好几天希望弄清楚但是我没有运气。同样,这条路线在开发过程中运行得非常好,但是当我尝试测试这些路线在rspec中工作时,它无法找到任何路线。

除状态代码外,文件中每个规范的错误消息都相同。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

尝试添加:id param 以获取方法。显示动作路径期望a:id param(show action for url的url:id param实际上是索引动作url)。

get :show, params: { id: 1, code: '422' }