1

私は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 オブジェクトに依存していますが、理論的には単体テストでは外部要因に依存すべきではありません。「スタブ」、「モック」などと考えましたが、適切にアプローチする方法がわかりません:-(

それを行うためのより良い方法が見えますか?スタブまたはモックオブジェクトを使用してこれを行うにはどうすればよいですか?

4

1 に答える 1

0

単体テストでは、外部要因から分離されたモデル/機能をテストする必要があるという仮定を実践し始めました。そこで、モデルに固有ではない外部の動作をスタブ化することにしました。モデルのメソッドの単体テストは次のParticipantようになります。

def test_paid_expense_items
  item1 = MiniTest::Mock.new
  items = MiniTest::Mock.new
  items.expect :where, [item1], [Hash]
  @participant.stub :items, items do
    assert_includes @participant.paid_expense_items, item1, "Participant's paid expenses should include items paid by himself/herself"
  end
end

これまでのところ、私はその解決策に満足しています。ただし、より良い解決策や補足情報、またはその他の貢献があると思われる場合は、遠慮なくコメントしてください。

于 2013-05-11T21:37:13.057 に答える