2011-07-11 24 views
4

テストを実行する前に、Railsがテストデータベースをクリアしないようにする方法はありますか?テスト用に本番データベースのコピーを使用したいので、毎回レールがデータを消去しないようにする必要があります。Ruby on Rails - テストデータベース

かなりのデータがあるので、可能な限り、私はそれが毎回データベースを埋めるために長い時間がかかると仮定しているので、治具を使用しないでください。

おかげで、 マイク

+1

テストの全ポイントは、あるテストから次のテストに変化しない予測可能なデータでデータベースを満たすことです。生産データを使用することで、その利益を失います。私は実際にあなたのためにデータベースデータをモックアップするために 'FactoryGirl'のようなものを使うことを考えています。 – iwasrobbed

答えて

0

は、私はあなたが一般的にテスト用の本番データを使用したくないと言って、これを序文みましょう。それは言っている...

あなたは "シード"データを読み込むことができますが、それ以外の場合は、テスト実行ごとに削除されますそれのための任意の什器を持っていないことを確認します。

データを自動的にシードする方法については、this answerを参照してください。

6

は手動

ruby -Itest test/unit/some_test.rb 

それはテストデシベルのレクリエーションを行いrakeタスクである

rake db:test:prepare 

しかし、私の提案を(あなたがそうのように手動で実行することができます)テストを実行して、それを避けることができますあなたが間違っているということです。 テストの一般的な考え方は、データベースの状態を知っていることで、関数から何を期待するのかを知ることです。

例えば、

test "search_by_name" do 
    expected = User.all.select{|u| u.name =~ /arthur/i} 
    assert_equal expected, User.search_by_name("Arthur") 
end 

しかし細かいテスト である、あなたは、DBの状態がわからない場合、どのようにアーサーがあると知っているのですか?

上記のテストは3つの悪いケースで合格します。

  1. いいえユーザーレコード
  2. はアーサーと呼ばいるユーザーがいないすべてのユーザーが、「アーサー」
  3. と呼ばれているはありません。

したがって、偽りのリアリティを作成するためには、 データベースの状態がわかります。

希望します。

  1. 少なくとも一つの別の単語
  2. 少なくとも一つの非アーサーのユーザーの一部として名前「アーサー」名前「アーサー」と
  3. 少なくとも1人のユーザを持つユーザー。

より良いテストは、dbが空であると仮定し、工場の女の子を使用している可能性があります。

test "search_by_name" do 
    expected = [ 
    Factory.create(:user, :name => "Arthur"), 
    Factory.create(:user, :name => "MacArthur") 
    ] 
    not_expected = [Factory.create(:user, :name => "Archer")] 
    assert_equal expected, User.search_by_name("Arthur") 
end 
+0

これは機能しませんでした。 ruby -Itest ...コマンドはテーブルからデータを削除しました。スキーマは元のままですが、データは削除されました。しかし、既知のデータに関するあなたの意見はよく取られています。今私はUI検証のためのテストを使用しているので、プロダクションデータを使用して、ユーザーが見ているものを見てテストします。しかし、もっと良い方法は、必要なテーブルを手に入れて、備品/種を作り、そのようにすることです。徹底的な答えをありがとう、私はそれを感謝します – hoitomt