1

Minitest でトランザクション フィクスチャを使用しています。最初にテストを実行すると、テストは正常に実行されます (そして合格します)。

rake test test/models/number_test.rb
Run options: --seed 31462
# Running:
..
Finished in 0.271344s, 7.3707 runs/s, 7.3707 assertions/s.
2 runs, 2 assertions, 0 failures, 0 errors, 0 skips

ただし、すぐにもう一度実行すると、失敗します。

rake test test/models/number_test.rb
Run options: --seed 22968
# Running:
EE
Finished in 0.058652s, 34.0997 runs/s, 0.0000 assertions/s.

  1) Error:
  NumberTest#test_to_param_is_number:
  ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR:  insert or update on table "calls" violates foreign key constraint "fk_calls_extension_id"
  DETAIL:  Key (extension_id)=(760421015) is not present in table "extensions".
  : COMMIT

  2) Error: 
  NumberTest#test_twilio's_API_is_configured_to_come_to_this_number's_URL:
  ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR:  insert or update on table "calls" violates foreign key constraint "fk_calls_extension_id"
  DETAIL:  Key (extension_id)=(760421015) is not present in table "extensions".
  : COMMIT

2 runs, 0 assertions, 0 failures, 2 errors, 0 skips

テーブルに外部キーを追加するためにschema_plus gem を使用しています。

フィクスチャはアルファベット順にロードされるためdeferrable: :initially_deferred、トランザクションの最後に参照整合性チェックのみを行うオプションを使用しているため、チェックの前にすべてのデータがすべてのテーブルにロードされます。これが、テストの最初の実行を機能させた理由です...しかし、2回目の実行でなぜ異なるのかはわかりません.

再テストを実行するとき、すべてのデータベース テーブルを空にし、据え置き可能オプションを使用してフィクスチャをリロードするべきではありませんか? それは、最初の後に遅延可能が尊重されないようです。

それを機能させるにはrake db:reset、実行中のテストの間に常に実行する必要がありますが、これはクレイジーに思えます。

更新 1:callsのすべてのフィクスチャ(実際には のテストとは関係ありません)をコメントアウトするとnumber_test.rb、すべて正常に動作します... 数値テストを何度でも再実行でき、それでも合格します。だから、それは延期と何かのようです。

4

2 に答える 2

1

これは、真の参照整合性の問題でした。numbers両方ともcalls最終的に にリンクしusersます。

結局のところ、usersフィクスチャはテスト サーバーには存在しませんでした。それはそれを行うだろう.

于 2015-05-30T06:48:11.707 に答える
0

Rails は、DB 内の制約トリガーを無効にしてクリーンアップしようとします。これを行うには、スーパーユーザーの役割が必要です。そうする:

次のように入力sudo -u postgres psqlして入力します。

ALTER USER yourdbusername SUPERUSER;
于 2015-10-29T22:09:40.430 に答える