0

story と ku の 2 つのオブジェクトのパラメーターを取る create アクションの Rspec コントローラー テストを作成しています。ストーリーは、タイトルと large_cover_url の存在を検証します。無効なパラメーターを渡すときにrspecが引数エラーをスローする理由がわかりません。この問題についての洞察を使用できます。

エラーは次のとおりです。

Failure/Error: post :create, story: {title: nil, large_cover_url: "present"}, ku: Fabricate.attributes_for(:ku)
     ArgumentError:
       wrong number of arguments (0 for 2)
     # ./app/controllers/stories_controller.rb:18:in `create'
     # ./spec/controllers/stories_controller_spec.rb:59:in `block (4 levels) in <top (required)>'

仕様は次のとおりです。

context "failed story creation" do
    let(:bob) { Fabricate(:user) }
    before { sign_in_user(bob) }

    it "does not create a new story" do
        post :create, story: {title: nil, large_cover_url: "present"}, ku: Fabricate.attributes_for(:ku)
        expect(Story.count).to eq(0)
    end
end

コントローラーのアクションは次のとおりです。

def create
    @story = Story.new(params[:story])
    @ku = Ku.new(params[:ku])
  if @story.save && @ku.save
    @story.update_column(:user_id, current_user.id)
    @ku.update_column(:user_id, current_user.id)
    @story.kus << @ku
    redirect_to story_path(@story), flash: {success: "Your story was published."}
  else
    flash[:error] = "#{@story.errors.full_message.join(', ')}"
    render :new
  end
end
4

1 に答える 1

1

このメソッドfull_messageは、属性の名前とエラー文字列をパラメーターとして受け入れるため、 を実行すると、パラメーターなしflash[:error] = "#{@story.errors.full_message.join(', ')}"で呼び出すことになります。代わりに、すべてのエラー メッセージを含む配列を返すfull_messageを使用する必要があります。full_messages

ActiveModel::Errors api ref

于 2013-09-09T01:45:44.950 に答える