私はRails 3で学んでおり、ユニットテストを始めました。いくつかの調査の後、単体テストに MiniTest を使用することにしました。
私は次のモデルを持っています
class Participant < ActiveRecord::Base
...
# returns all items that were paid by participant
def paid_expenses
self.items.where(:payee_id => self.id)
end
...
end
私はまだそのメソッドを単体テストする方法を考えているところです。以下のテストケースを思いつきました。
class TestParticipant < MiniTest::Unit::TestCase
def setup
@participant = Participant.new
@participant.first_name = "Elyasin"
@participant.last_name = "Shaladi"
@participant.email = "Elyasin.Shaladi@come-malaka.org"
@participant.event_id = 1
end
...
def test_paid_expenses
@participant.save!
item1 = @participant.items.create!( item_date: Date.today, amount: 10, currency: "EUR", exchange_rate: 1, base_amount: 10, payee_id: @participant.id, payee_name: @participant.name )
item2 = Item.create!( item_date: Date.today, amount: 99, currency: "EUR", exchange_rate: 1, base_amount: 10, payee_id: 99, payee_name: "Other participant" )
assert_includes @participant.paid_expenses, item1, "Participant's paid expenses should include items paid by himself/herself"
refute_includes @participant.paid_expenses, item2, "Participant's paid expenses should only include items paid by himself/herself"
end
...
end
ここまでできましたが、正直満足していません。私はそれよりもうまくやることができたという気持ちがあります。ここでは Item オブジェクトに依存していますが、理論的には単体テストでは外部要因に依存すべきではありません。「スタブ」、「モック」などと考えましたが、適切にアプローチする方法がわかりません:-(
それを行うためのより良い方法が見えますか?スタブまたはモックオブジェクトを使用してこれを行うにはどうすればよいですか?