2016-06-29 12 views
1

私は、別のテーブルの内容に基づいて動的にスコープを追加したActiveRecordクラスを持っています。Railsテスト、フィクスチャとクラスロードの順序

(簡略化されたコード例)

class Thing < ActiveRecord::Base 

    Feature.all.each do |feature| 
    scope feature.name, ->{joins(:feature).where("feature.name = #{feature.name})} 
    end 
end 

アプリのUIの別の部分は、あなたが検索の一部として、これらの機能のスコープを検索し、適用することができます「シングディスプレイ」です。

これは、実行中のアプリですべて正常に動作します。

しかし、テストでは、どのような順序で物が読み込まれているかによって異なります。Thingには予想される範囲があり、それ以外の時はありません。テストを実行する前にFeature.countを呼び出してFeatureのクラスとフィクスチャを最初にロードするように強制することはできたが、これはうまくいかないと思った。

これを解決するためのクラス/フィクスチャのロードを強制する方法はありますか?

+0

[this](http://stackoverflow.com/a/28515064/2116518)または[this](https://sanjusoftware.wordpress.com/2010/12/17/)に関連していないことを確かめてくださいレールフィクスチャー - ロードオーダー/)? –

+0

@NicNilov私はPostgresを実行していません.dbに外部キーの制約がなく、テストの実行順序によってテストが合格/不合格になります。したがって、リンクされた問題は適用されません。 – z5h

答えて

0

クラスの前に器具がロードされていることを確認する目的で、探索するためのいくつかの指示があります。

1つは、フィクスチャがロードを終了したことを検出し、Thingクラスを強制的にリロードして適切なスコープを生成することです。この問題は、フィクスチャがロードされたイベントを検出する方法を見つけることができなかったことです。接線の問題は、config.cache_classes = trueの存在下で個々のクラスのリロードがかなりハッキリであるということです。

さらに有望なアプローチはthis answerに記載されており、テストランナータスクをラッパーに入れて、まずフィクスチャーが最初にロードされるようにします。

関連する問題