'No route matches' 在 Rails 上使用 Factory Girl 时出错

'No route matches' error while using Factory Girl on Rails

我一直在尝试使用 FactoryGirl 对我的 Rails 应用程序进行测试,但我 运行 遇到了困难。

我觉得好像一定有​​什么地方很明显我做错了,但是经过大量搜索我还是没能找出原因。

我正在尝试 运行 测试以确认 'show' 操作在我的一个控制器上是否成功。

这是我收到的错误消息:

Failure/Error: get 'show'
ActionController::UrlGenerationError:
   No route matches {:action=>"show", :controller=>"simple_requests"}

以下是导致此结果的相关代码片段。

/spec/controllers/simple_requests_controller_spec.rb

require 'spec_helper'

describe SimpleRequestsController do

  describe "GET 'show'" do

   before do
    @simple_request = build(:simple_request)
   end

  it "should be successful" do
      get 'show'
      expect(response).to be_success
    end

  end
end

/factories/simple_requests_controller_spec.rb

FactoryGirl.define do 
  factory :simple_request do
  id                          123
  full_name                   "Testie McTesterson"
  company                     "Test Company"
  role                        "Analyst"
  email                       "foobar@foobs.com"
  phone                       "000888"
  message                     "Test question?"
  end
end

/controllers/simple_requests_controller.rb

  def show
    authorize SimpleRequest #For pundit
    @simple_request = SimpleRequest.find(params[:id]) 
  end

关于为什么会发生这种情况,我有两个假设:

1) Rspec 正在寻找 'show' 操作的 ID,但不知何故找不到。 (虽然工厂里有一个,但我还没有弄清楚它怎么不会流过。)

2) Pundit 导致了问题,因为 show 操作可能需要授权(尽管注释掉 'authorize' 行目前没有任何区别)

欢迎任何想法:)

编辑

粘贴在 rake 路由的输出下方 | grep simple_requests

simple_requests GET    /simple_requests(.:format)          simple_requests#index
                POST   /simple_requests(.:format)          simple_requests#create
 new_simple_request GET    /simple_requests/new(.:format)      simple_requests#new
 edit_simple_request GET    /simple_requests/:id/edit(.:format) simple_requests#edit
 simple_request GET    /simple_requests/:id(.:format)      simple_requests#show
                     PATCH  /simple_requests/:id(.:format)      simple_requests#update
                     PUT    /simple_requests/:id(.:format)      simple_requests#update
                     DELETE /simple_requests/:id(.:format)      simple_requests#destroy

编辑 2 - 添加 ID 参数

我现在也尝试添加一个id如下:

it "should be successful" do
  get 'show', id: @simple_request.id
  expect(response).to be_success
end

这次收到如下错误信息

ActiveRecord::RecordNotFound: Couldn't find SimpleRequest with 'id'=123

'123' 是我 /factories 中的 ID - 我想我必须缺少一些东西才能让它工作,但我还不知道是什么。

试试这个:

before do
  @simple_request = create :simple_request
end

it "should be successful" do
  get 'show', id: @simple_request.id
  expect(response).to be_success
end

这是一个 show 视图,因此您必须使用 ID 提供您的请求,并且您实际上必须使用 create 而不是 build 在你的 before 块中。

您的 SimpleRequest 没有 ID。您需要使用 create 而不是 build

 before do
    @simple_request = create(:simple_request)
 end

 it "should be successful" do
   get 'show', id: @simple_request.id
   expect(response).to be_success
 end