RSpec: как да симулирам правилно #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

Опитвам се да изобразя json в блока else в моя тест, но не мога да го направя. Засега конкретният тест изглежда така:

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, ще съм много благодарен!


person Iris    schedule 23.03.2016    source източник


Отговори (1)


@chiliNUT Да, това е много вярно, освен че поддържаме браузъри с деактивиран JS, понякога не искаме допълнителна заявка. Извършването на допълнителна обработка в PHP обаче може да забави показването на страницата, ако това е интензивна работа. Следователно човекът, който решава, трябва да претегли и двата фактора.
person j-dexx    schedule 23.03.2016
comment
Благодаря за бързия отговор! Expect(project).to receive(:destroy) хвърля грешка на недефиниран метод. Ако отпечатам response.body на конзолата, все още виждам резултата „щастлив път“. Как работят allow() и_return(false)? - person Iris; 23.03.2016
comment
Съжалявам, @Iris, това трябва да е have_received. По същество това е в подигравки на rspec. По принцип просто казва на rspec да позволи на проекта да получи повикване до destroy и да върне това, което искаме, т.е. false. Ще искате да добавите други твърдения, за да проверите съобщението/състоянието. - person j-dexx; 23.03.2016
comment
Благодаря @j-dexx. Реших и опитах, но сега отново получавам това Failure/Error: expect(project).to have_received(:destroy) (#<Project:0x007f89b4fb4a88>).destroy(*(any args)) expected: 1 time with any arguments received: 0 times with any arguments :( - person Iris; 23.03.2016
comment
Възможно ли е това да е, защото не използвам двойно? - person Iris; 23.03.2016
comment
Какво ще стане, ако промените разрешението да бъде allow(Project).to receive(:find).and_return(project) Не би трябвало да има значение, че не използвате двойна, а фабрика за момичета. Не мисля, че имате нужда от project.destroyed?, което трябва да можете да направите if project.destroy - person j-dexx; 23.03.2016