我的spec / controllers / undertakings_controller_spec.rb在下面。
require 'rails_helper'
RSpec.describe UndertakingsController, type: :controller do
describe '#create' do
let(:undertaking_params) do
attributes_for(:undertaking)
end
it 'increases undertaking by 1' do
user=create(:user)
login_user user
expect{post :create , undertaking: undertaking_params }.to change(Undertaking, :count).by(1)
end
end
end
我删除了此spec文件中的其他操作,因为其他操作的测试有效。 我的控制器/ undertakings_controller.rb在下面。
class UndertakingsController < ApplicationController
def create
@undertaking=current_user.undertakings.build(undertaking_params)
@undertaking.asking_id=params[:asking_id]
if @undertaking.save
flash[:success] = "依頼の申し込みに成功しました。"
redirect_to @undertaking.asking
else
@asking=@undertaking.asking
render 'askings/show'
end
end
和我的模特/承诺.rb在下面。
class Undertaking < ActiveRecord::Base
belongs_to :user
belongs_to :asking
has_many :comments
has_one :deciding
validates :content , presence: true , length: {maximum: 800}
validates :title , presence: true , length: {maximum: 20}
end
我的错误如下。
No route matches {:action=>"create", :controller=>"undertakings", :undertaking=>{:title=>"MyString", :content=>"MyText", :result=>false}}
创建行动的路线如下。
asking_undertakings POST /askings/:asking_id/undertakings(.:format) undertakings#create
我想也许错误导致没有:spec文件中的ask_id。 但我无法理解我应该做些什么。 请告诉我。
答案 0 :(得分:1)
根据路线中的定义,您的创建路径需要asking_id
作为参数传递。所以,从
post :create , undertaking: undertaking_params
到
post :create, asking_id: <asking-id>, undertaking: undertaking_params
应该有用。
我发现你没有在你的rspec中创建Asking
。因此,您首先需要创建一个,然后在post :create
调用中传递其ID。
<强>更新强>
您可以使用factory-girl在rspec中创建Asking
对象,前提是已为Asking
模型定义了工厂。
asking = create(:asking)
post :create, asking_id: asking.id, ...