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
は正しいマッチャーではないと思いますよね?エラーが発生しないでこのテストを作成する方法を教えていただけますか?
それは正しいマッチャーですが、あなたはそれを正しい方法で使用していません:
正しい方法は
expect { user.destroy }.to change { Project.count }
これは単に数値が変化することを主張するだけで、どの程度かを指定するものではありません。そのためには、by
への呼び出しをチェーンします。
expect { user.destroy }.to change { Project.count }.by(-1)
Shouldaマッチャーを使用することもできます。
it { expect(user).to have_many(:projects).dependent(:destroy) }
これはうまくいくはずです:
expect { user.destroy }.to change { Project.count }.by(-1)
実際のプロジェクトの削除をテストする必要があります。
expect(Project.all).not_to include project