我一直在尝试使用FactoryGirl进行Rails应用程序的测试,但我遇到了困难。
我觉得好像一定有一些相当明显的事情我做错了,但经过多次搜寻后我找不到原因。
我正在尝试进行测试,以确认该节目'我的一个控制器上的操作成功。
这是我收到的错误消息:
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'行动,但不知何故无法找到它。 (虽然工厂里有一个,但我还没弄明白它是如何流过的。)
2)专家正在引发问题,因为演出行动可能需要授权(尽管评论出“授权行”目前没有任何区别)
欢迎任何和所有的想法:)
修改
在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'是我/工厂的ID - 我想我必须遗漏一些东西让这个工作,但不能弄清楚到底是什么。
答案 0 :(得分:3)
试试这个:
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
提供请求,并且您必须使用{{1}实际创建记录而不是create
块中的build
。
答案 1 :(得分:3)
您的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