2

セットアップ:

私の Rail 3.2.12 アプリでは、さまざまなモデル メソッドのほとんどをテストするために Rspec と FactoryGirl を使用しています。

私は Postgres を本番、開発、およびテストに使用しています。

問題:

1 つのモデル ZipCodes には、経度/緯度データを含む約 40,000 行と、特定の基準を満たすレコードを選択するための多数のメソッドがあります。

これらのメソッドを実際のデータに対してテストする必要があります。サイズが大きいため、テストを実行するたびにテーブルを再ロードするのは遅すぎます。

質問:

ターミナルまたはコンソールまたは rake タスクを介してその静的な ZipCodes テーブルを一度ロードし、データが変更されない限り/変更されるまでそのままにしておくにはどうすればよいですか (数か月ごとにいくつかの郵便番号を追加する可能性があります)。(また、各テストの実行後に DatabaseCleaner で消去しませんが、別の質問で答えを得ましたが、:except => [テーブル名] を使用できます。)

現在、CSV および YAML 形式のデータがありますが、必要に応じて他の形式に移動できます。

また、開発データベースからテスト データベースにデータをコピーする方法があれば、データを開発データベースにロードします。

(注: 関連付けには主キーを使用しません。郵便番号や経度などの他のフィールドですべてのルックアップを行うため、データをテストにロードする方法が私の開発データベースから主キーを取得するかどうかは問題ではありません)

4

1 に答える 1

3

テストスイートに database_cleaner gem を使用することをお勧めしますhttps://github.com/bmabey/database_cleaner

次に、手動で ZipCodes テーブルにデータを入力して、データの準備を整えることができます

秘訣は、database_cleaner を構成して、ZipCodes テーブルをそのままにしておくことです。これを行うには、spec_helper.rb で設定する必要がありますDatabaseCleaner.strategy = :truncation, {:except => %w[zip_codes]}(戦略が切り捨てで、テーブル名が zip_codes の場合)

詳細については、database_cleaner doc を参照してください (上記の回答のリンク)

編集

DB の作成に関する 2 番目の質問に答えるには、複数の選択肢があります。

これらの手法は、テスト環境の外で適用できます (例: を指定してコマンド ラインからシードを実行するRAILS_ENV=test)。そうすることで、テスト DV にデータを入力し、このテーブルをクリアしないように database_cleaner を指定すると、そのままになります。

移行を実行するたびにrake db:test:prepare、テスト データベース構造を更新するために実行する必要があることに注意してください。したがって、このテーブルのデータのインポートを再度実行する必要があります。これは、テスト シナリオ間の時間を大幅に節約できるため、依然として便利です。

于 2013-07-19T00:26:46.457 に答える