3

簡体例:AnimalモデルのRSpecの/ FactoryGirl - STIをRailsの - 平等

I最近のセットアップSingle Table InheritanceCatDogAnimalのサブクラスです。

私はAnimal工場があります。私のテストスイートにほとんどどこでも factory :animal do type { ["Dog","Cat"] }.sample end

Animalの種類は、テストのために無関係であるので、私は let(:animal) { Factory.create(:animal) }を呼び出します。 STIに移動するので、私はスーパーAnimalは工場によって返されたが、関連するオブジェクトがAnimalをインスタンス化するとき、彼らはサブクラスを返すので、私はこれらの動物の平等のチェックを実行し、エラーを取得しています。

例:expect(zoo.animal).to eq(animal)がで失敗し : expected: #<Cat:0x007fa01a8cd360 same_other_attributes...> actual: #<Animal:0x007fa01b8d33b8 same_other_attributes...>

が、私はそのサブクラスのインスタンスを返すためにAnimal工場を変更することができます方法はありますか?

工場ではAnimal.reloadを呼び出してみましたが、新しい(サブ)クラスの再読み込みを開始しませんでした。私はあなたが変更を強制するsuperclass.becomes!(subclass)を呼び出すことができ、通常は知っているが、実際に変換されたオブジェクトを返すような方法でFactoryGirlコールバックにそれを置く方法がわかりません。

+0

あなた 'animal'宣言がZoo''のように何を求めていますか?その宣言を変更して、親クラスではなく子クラスを返すことができます。 – kcdragon

+0

あなたは{[「犬」、「猫」]} .sample.classにテストスイートを変更することはできますか? – hashrocket

+0

@HashRocketどのように役立つでしょうか? @kcdragonその特定の例では 'Zoo' has_one' Animal'と私は仕事がその動物園の動物を適切に設定することをテストします。しかし、私が言及したように、私がテストスイート全体で失敗したテストを行っているのとは無関係です。 'Animal'が' FactoryGirl'で元々作成されたものであると期待している複数のテストは、 'Cat'または'犬。私は、彼らはむしろ(それは問題ないはず場合は特に)どこでもタイプを指定するよりも最初に作成 'Animal'に合わせ確保するために行うことができるものがあるかどう*、私は思ったんだけど、なぜ私は*理解しています。 – kittyminky

答えて

6

あなたはinitialize_with

を使用して、サブクラスのインスタンスを返すために、スーパークラスの工場を強制することができます例:

initialize_with do 
    klass = type.constantize 
    klass.new(attributes) 
end 
関連する問題