簡體   English   中英

如何測試依賴::destroy with RSpec?

[英]How to test dependent: :destroy with RSpec?

我想測試我的User模型關聯has_many :projects, dependent: :destroy現在已經走了這么遠:

it "destroys dependent projects" do
  user = FactoryGirl.build(:user)
  project = FactoryGirl.build(:project)

  user.projects << project
  user.destroy

  expect(Project.count).to change(-1)
end

但這給出了一個錯誤:

Failure/Error: expect(Project.count).to change(-1)
     ArgumentError:
       `change` requires either an object and message (`change(obj, :msg)`) or a block (`change { }`). You passed an object but no message.

所以我認為change不是正確的匹配器,是嗎? 你能告訴我如何編寫這個測試而不會出現那個錯誤嗎?

您還可以使用 shoulda 匹配器:

it { expect(user).to have_many(:projects).dependent(:destroy) }

https://github.com/thoughtbot/should-matchers

這是正確的匹配器,但您沒有以正確的方式使用它:

  • expect 需要接收一個包含要執行的操作的塊(在您的情況下刪除用戶)
  • change 需要接收一個產生預期改變的數值的塊(它也可以接收一個對象和一個符號,指示 rspec 應該調用命名方法)

正確的方法是

expect { user.destroy }.to change { Project.count }

這只是斷言數值變化,但沒有指定變化多少。 為此,將調用鏈接到by

expect { user.destroy }.to change { Project.count }.by(-1)

這應該有效:

expect { user.destroy }.to change { Project.count }.by(-1)

您應該測試是否刪除了實際項目。

expect(Project.all).not_to include project

這應該有效:

it { is_expected.to have_many(:projects).dependent(:destroy) }

暫無
暫無

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

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