1

ActiveRecord を使用して情報を sqlite db ファイルに保存するプロジェクトがあります。私は Rails を使用していませんが、AR は完璧に機能しているようです。私の質問は、データベースにアクセスせずにクラスを正確にテストする方法ですか? いくつかの宝石 (FactoryGirl、UnitRecord) を見つけましたが、それらは Rails で動作することを意図しています。

class News < ActiveRecord::Base
belongs_to :feed

def delete_old_news_if_necessary
  # time_limit = Settings::time_limit
  return if time_limit.zero?

  News.destroy_all("date < #{time_limit}")
end

def delete_news_for_feed(feed_id)
  News.destroy_all(:id => feed_id)
end

def news_for_feed(feed_id)
  News.find(feed_id)
end
end

列スタブを実行できることを読みました:

Column = ActiveRecord::ConnectionAdapters::Column
News.stubs(:columns).returns([Column.new(),...])

これはこれらのテストを行う正しい方法ですか? また、テスト用に別のデータベースを作成し、それを作成し、テストを実行し、削除する方が良いのはいつですか?

4

1 に答える 1

1

テストでデータベースにアクセスするのを避けたい場合は、mocha gem をお勧めします。スタブを行うだけでなく、期待を定義することもできます。

編集:いつテストデータベースを使用する方が良いかについてのあなたの質問について:それに対する理由がないときはいつでも言います。:)

編集:たとえばNews.find、テストで次のようにモックできます。

def news_for_feed_test
  # define your expectations:
  news = News.new
  News.expects(:find).with(1).returns(news)
  # call the method to be tested:
  News.new.news_for_feed(1)
end

同時に、これにより、find正確に 1 回呼び出されます。Mocha ができることは他にもたくさんあります。ドキュメントを見てください。ところで、あなたのこれらのメソッドはクラスメソッドであるように見えますね?

于 2013-02-07T13:25:53.273 に答える