Rspec错误,在所有模型中创建操作

时间:2017-01-03 05:29:38

标签: ruby-on-rails ruby rspec

我的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。 但我无法理解我应该做些什么。 请告诉我。

1 个答案:

答案 0 :(得分:1)

根据路线中的定义,您的创建路径需要asking_id作为参数传递。所以,从

修改你的rspec线
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, ...