我的规范/控制器/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
我删除了此规范文件中的其他操作,因为其他操作的测试有效。和我的控制器/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
我认为可能是错误导致规范文件中没有:asking_id。但我不明白我应该怎么做。请告诉我。
正如路由中所定义的,创建路径需要asking_id
作为参数传递。因此,修改您的 rspec 行从
post :create , undertaking: undertaking_params
自
post :create, asking_id: <asking-id>, undertaking: undertaking_params
应该工作。
我看到您没有在 rspec 中创建Asking
。因此,您首先需要创建一个,然后在post :create
调用中传递其 id。
更新
您可以使用工厂女孩在 rspec 中创建Asking
对象,前提是您已经为Asking
模型定义了工厂。
asking = create(:asking)
post :create, asking_id: asking.id, ...