簡體   English   中英

如何使用 Rspec 測試控制器中的銷毀故障?

[英]How to test destroy failure in controller using Rspec?

我有一個具有以下操作的書籍控制器...

def destroy
   @book = Book.find(params[:id])
   if @book.destroy
     redirect_to(books_path)
   else
     render('delete')
   end
 end

我可以測試第一個 if 情況,但不能測試 @book.destroy 返回 false 的情況。 我的問題是 - 如何讓 @book.destroy 失敗? 我想編寫一個 rspec 測試來涵蓋這種情況。

describe "destroy" do
   before(:context) do
     @book = create(:book)
   end
   context "failing the destroy function" do
     it "renders delete" do
       allow(@book).to receive(:destroy).and_return(false)
       delete :destroy, params: { id: @book.id }
       expect(response).to render_template(:delete)
     end
   end
 end

我試着寫上面的想法,allow(@book).to receive(:destroy).and_return(true) 會使 destroy() 返回 false,但相反,它仍然返回 true 並測試第一個 if 語句中的代碼。 我不知道如何覆蓋 else 語句中的代碼。 請問有什么幫助嗎?

謝謝。

您的測試不起作用的主要原因是Book.find將從數據庫加載記錄並創建該類的新實例,這意味着不會在您存根的同一對象上調用#destroy

您需要存根Book.find方法,以便它使用存根方法返回 book 實例:

describe "destroy" do
  context "failing the destroy function" do
    let(:book) { build_stubbed(:book) } # use let instead of ivars

    # don't use before :context unless you actually 
    # have a real reason. You should strive to have 
    # each example setup/teardown on their own 
    before do
      allow(book).to receive(:destroy).and_return(false)
      allow(Book).to receive(:find).and_return(book)
    end 

    it "renders delete" do
      delete :destroy, params: { id: book.id }
      expect(response).to render_template(:delete)
    end
  end
end

暫無
暫無

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

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