簡體   English   中英

RSpec:如何正確模擬#destroy失敗

[英]RSpec: how do I correctly simulate #destroy failure

我很難在控制器中模擬destroy方法的失敗。

我的控制器的銷毀看起來像這樣:

def destroy
   project = Project.find(params[:id])
   project.destroy

  if project.destroyed?
    render json: {
      project: nil,
      message: "The project was successfully deleted"
    }
  else
    render json: {
      message: "Could not delete project",
    }, status: :unprocessable_entity
  end
end

我正在嘗試在測試中的else塊中呈現json,但無法完成。 到目前為止,特定測試如下所示:

describe "DELETE #destroy" do

 let!(:project) { create(:project, :open) }

  context "when invalid" do

   it "returns an error if the project was not deleted" do
     expect(Project).to receive(:find).with(project.id.to_s).and_call_original
     expect(project).to receive(:destroy).and_return(false)
     delete :destroy, id: project
   end

 end
end

測試要么返回“幸福的道路”,要么給我錯誤。 在這一刻:

 Failure/Error: expect(project).to receive(:destroy).and_return(false)

       (#<Project:0x007f87cf5d46a8>).destroy(*(any args))
           expected: 1 time with any arguments
           received: 0 times with any arguments

如果有人能指出正確的方向並說明如何模擬422,我將不勝感激!

您希望一開始就允許,而不是期望。 期望是斷言的一部分。

it "returns an error if the project was not deleted" do
  allow(Project).to receive(:find).with(project.id.to_s).and_call_original
  allow(project).to receive(:destroy).and_return(false)

  delete :destroy, id: project

  expect(Project).to have_received(:find)
  expect(project).to have_received(:destroy)
end

我假設你是對的

allow(Project).to receive(:find).with(project.id.to_s).and_call_original

但我從未見過,我通常會

allow(Project).to receive(:find).with(project.id.to_s).and_return(project)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM