私の Rails モデル: タスク has_many の位置。
シナリオ: 新しいポジションを作成すると、それ自体がタスクになるはずです。私はそれをテストしたいと思います、そして私はこのようにしています:
context "creating a new position" do
let(:position) { create :position, name: 'Read some books', :task => nil }
it "should create a simple task" do
Task.find_by_name('Read some books').should be_nil # First should
position # Execute let() block (FactoryGirl is lazy evaluating)
Task.find_by_name('Read some books').should_not be_nil # Second (more relevant) should
end
end
では、テストを改善するにはどうすればよいでしょうか。最初の「すべき」は、タスクがまだ存在しないことを確認するだけなので、ポジションを作成するとタスクが作成されることを確認できます。しかし、これは「ブロックごとに 1 つのみ」という原則に違反しています。それで、これはどうですか?
context "creating a new position" do
let(:position) do
position = create :position, name: 'Read some books', :task => nil
Task.delete_all
position
end
it "should create a simple task" do
position # Execute let() block (FactoryGirl is lazy evaluating)
Task.find_by_name('Read some books').should_not be_nil
end
end
それとも、とにかくそのようなタスクがあってはならないという事実を単純に当てにする必要がありますか (クリーンなテスト データベースにはタスクがないため)。ご意見ありがとうございます。
更新 (解決策)
いくつかの調査の後change
、RSpec のマッチャーを見つけました。
let(:position) { create :position, name: 'Read some books', :task => nil }
it "should create a simple task" do
# Thanks to FactoryGirl's lazy evaluation of let(), the position doesn't yet exist in the first place, and then after calling position in the expect{} block, it is created.
expect { position }.to change{ Task.count(conditions: { name: 'Read some books' }) }.by(1)
end