5

私は、ユーザーと技術者の情報を保持するための単一の "Accounts"テーブルを持つSTIモデルを使用しています(ユーザー<アカウント、技術者<アカウント)。すべてが機能的な観点から動作しますが、ユニットテストを実行するときに物事が爆発:Ruby on Rails単一テーブル継承(STI)と単体テストの問題(PostgreSQL)

... 8)エラー: test_the_truth(UserTest): のActiveRecord :: StatementInvalid:PGError:ERROR:リレーション "技術者" が存在しません :基本的に「技術者」 ...

FROM DELETE、標準フレームワークは、技術者とユーザーテーブル(または「関係」PostgreSQLはそれらを呼び出すようには)存在しないことを認識して、実際には、すべきではありませんアカウントにエイリアスされます。

アイデア?私はRoRには比較的新しいので、STIを一掃することなくこれを修正する方法としては迷っています。

+0

エラーを生成している単体テストと、エラーが発生したときに呼び出すメソッドの両方を投稿できますか? –

答えて

12

問題が原因の存在のためだったことが判明:

./test/fixtures/technicians.yml ./test/fixtures/users.yml

は、これは理にかなっているようフレームワークは、同様の名前のテーブルにデータを挿入できることが期待されます。

+1

<3スタックオーバーフロー。私はもっ​​とあなたを改造することができれば願っています! – nfm

0
  • アカウントテーブルに「タイプ」列が含まれていることを確認しましたか? STIを動作させるには、1つ必要です。
  • 私は実際には 'type'という列とのデータベースの互換性の問題を抱えていましたが、時にはそれを緩和するために 'kind'に切り替えました。それは問題かもしれません。基本クラス(Account)にself.inheritance_column = "kind"を設定し、それが役立つかどうか確認してみてください。
+0

アカウントには "タイプ"の列が含まれていましたが、残念ながらその名前を "kind"に変更すると提案が役に立たなかった。問題は続く。 –

2

子モデルのYAMLファイルを削除することによって解決された同様の問題がありました。本質的にレールは、/ test/fixtures /で作成されたフィクスチャを見て、それぞれのテーブルを空にして、それらをリロードできるようにしています。

私の場合は、新しいfixtureを自動的に作成するscript/generate modelコマンドを実行していました。次に、モデルを適切な親クラスから継承するように変更しました。さて、フィクスチャがまだ存在していたので、レールは器具をロードする前に子供から削除しようとしていました。

実際にデータをプリロードする必要がある場合は、親モデルのフィクスチャを使用し、タイプフィールドを適切なモデル名に設定する必要があります。

関連する問題