0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】ブラウザ目視はOKなのにRSpecが全滅?14個のFailureから学んだ「テストデータの工場」の罠

Last updated at Posted at 2026-01-14

タイトル:

  1. 起きたトラブル:14個のテストが全て「赤」
    Railsで商品出品機能を実装。 ローカル環境でも、Renderにデプロイした本番環境でも、ブラウザからの動作確認は完璧!手数料計算のJavaScriptも、画像アップロードも、DB保存もしっかり動いている。

「あとはテストをパスさせるだけ」と軽い気持ちでRSpecを走らせた結果……。

14 examples, 14 failures

真っ赤に染まったターミナル。 「ブラウザであんなに動いているのに、なぜテストだけ1つも通らないの?」という絶望に陥りました。

  1. 原因:ブラウザとテストでは「データの通り道」が違う
    原因を深掘りすると、「データの通り道」が根本的に違うことがわかりました。

ブラウザ(手動テスト): 自分が画面(View)から入力した「最新のフォームデータ」をRailsが処理する。

RSpec(自動テスト): ブラウザを通さず、FactoryBotという「テストデータの工場」から直接データを生成しようとする。

今回の実装では、DBのカラム名変更(description → info / status_id → sales_status_idなど)を行いましたが、FactoryBot側の設計図が古い名前のままだったため、テスト実行の瞬間に「存在しない場所に値を入れようとしている!」とエラーになり、テストが現場に届く前に全滅していたのです。

  1. そもそも「FactoryBot」って何?
    今回のエラーの犯人(であり、修正の鍵)だったのが FactoryBot です。一言でいうと、「テスト用のデータを自動生成してくれる『設計図(工場)』」です。

Railsのテストは、実行のたびにテスト用DBがリセットされます。テストの度に「ユーザーを作って、商品を作って……」とコードを書くのは大変なので、あらかじめ spec/factories に作り方を定義しておき、FactoryBot.build(:item) と呼ぶだけでデータを生成できるようにする便利なツールです。

今回は、「本編のDB(Migration)」は最新にしたのに、「工場の設計図(FactoryBot)」が古いままだったため、不整合が起きていました。

  1. 解決へのステップ
    ① FactoryBot(設計図)を最新にする
    spec/factories/items.rb を開き、READMEの最新定義と同期させました。

Ruby
https://github.com/358TECH-CAMP/furima-46777/commit/a743b60984e91b551a6f8f97c08f6497acda84b9

古いカラム名のままだとデータ作成自体に失敗する

sales_status_id { 2 } # status_id から変更
info { "テスト説明" } # description から変更
② テストコード(期待値)を最新にする
RSpecはエラーメッセージの内容まで一言一句チェックします。カラム名が変わるとRailsが吐き出すメッセージも変わるため、expect の中身も修正しました。

Ruby
https://github.com/358TECH-CAMP/furima-46777/commit/f57bbbdf4fa733ec8be3c9a7b435c29f294794c7

修正前

expect(@item.errors.full_messages).to include("Description can't be blank")

修正後

expect(@item.errors.full_messages).to include("Info can't be blank")
③ テスト環境の「材料」を揃える
RSpecはPC内の物理ファイルを探しに行きます。public/images/test_image.png が存在しないために起きていた Errno::ENOENT を解決するため、ディレクトリとダミー画像を用意しました。

  1. まとめ:テストが教えてくれたこと
    今回のトラブルを通じて、RSpecの本当の役割を学びました。

環境の独立性: ローカル/本番環境と、テスト環境はデータ作成のルートが別物。

仕様の番人: 「コードを変えたらテスト(設計図)も変える」。これを怠ると、RSpecは全力で警告してくれる。

エンジニアの安心: RSpecをオールグリーンにすることは、単なる作業ではなく「この機能は設計図通りに動く」という客観的な証明。

「目視OK」で満足せず、RSpecという「もう一人の厳しい検品官」と向き合うことで、コードの品質は一段上のステージに行けるのだと感じました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?