みんなテストを書く時、どう進めてますか?
私は完全にテストファーストで作れる程、聡明になれない(ベストなのを探って試行錯誤が入る)ので、先ずは正常系を実装して、正常系のテストを書いて通す。その後、検証パターンを網羅するようにRSpecを組み立て、ケース毎に期待値を設定して失敗させ、通るように実装して行くのが、一番やりやすいと感じています。

テストはいきなり正しさ(バグなし)を担保できるものではなく、継続開発において、変わらない事を担保できるものです。
何故ならば、そもそもテストケースが誤っていて、テストは通るけど、期待する動きと違うという事はあり得るからです。
この辺はテストケースの精査や総合テストで潰したり、(無い方がいいけど)運用後に見つかった場合も含め、テスト込みで直す事で、継続的な安心感が買えるのは大きな利点ですね。
(大量のテストを毎回手動でやっていたら時間も掛かるし、不安感も残ってしまう)

今回のケース

前置きが長くなっちゃいましたが、先ずテストを書いて失敗させてと進めたい所、そうも行かないケースもありそう。
今回はレコード削除(user)時に関連するテーブルのレコード(member)も削除したい。

SpecにFactoryBotでレコードを追加してみた。

        FactoryBot.create(:member, customer_id: customers[0].id, user_id: user3.id, power: :Owner)
        FactoryBot.create(:member, customer_id: customers[1].id, user_id: user3.id, power: :Member)

いきなり、こんなエラーが。期待値はitに書いた項目の失敗だったが、先にDBエラーに。

      ActiveRecord::InvalidForeignKey:
        Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails (`rails_app_test`.`members`, CONSTRAINT `fk_rails_2e88fb7ce9` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`))

「dependent: :destroy」をテストで失敗(エラーでなく)させてから書きたかったが
。。。仕方ない

  has_many :member, dependent: :destroy

エラーメッセージ(今回はCannot delete or update)を直ぐ理解できれば話は早いけど、
他(データの作り方の問題かとか)を先に疑ってしまった。

理由は下記に詳しく書かれています。
外部キーを持つデータのdestroyを行うための設定

まとめ

参考までに、今回のコミットです。
別件も入っていますが、user_spec.rb → user.rbの順で直したかったと。
https://dev.azure.com/nightonly/rails-app-origin/_git/rails-app-origin/commit/d266388813f2ccb7e59cddf89b311a0a429246e4

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です