[英]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.