0
0

【Rails】Rspecで500エラーが出る

Posted at

はじめに

この記事では、学習中に出会ったエラーとその解決までの道のりを自分のために記録しています。
初学者のため理解が不十分なところがあるかもしれません。その場合はご指摘いただけると幸いです。

起こった問題

Solidusを使用してECサイトを作成中、Rspec(リクエストスペック)を実行したところ500エラーが返ってきた

結論

テストに使用しない場合でもviewで使用しているデータはテストデータとして作成しておく

解決までの道のり

前提条件

  • Solidusに予め用意されているテストデータを使用
  • viewには商品カテゴリーのパンくずリスト、商品画像、商品名、金額を表示

発生したエラー

スペックファイルは下記のように記述

spec/requests/product_spec.rb
require 'rails_helper'

RSpec,describe "Products", type: : request do
  describe "GET /products" do
    let!(:product) { create(:product) }

    it "returns http success" do
      get product_path(product.id)
      expect(response).to have_http_status(:success)
    end

    it "商品名が適切に取得できていること" do
      expect(response.body).to include product.name
    end
  end
end

テストを実行したところ下記のような結果になりました。

Failures:
  1) Products GET /products returns http success
     Failure/Error: expect(response).to have_http_status(:success)
       expected the response to have a success status code (2xx) but it was 500
     #./spec/requests/products_spec.rb:10:in 'block (3 levels) in <top (required) >'

  2) Products GET /products 商品名が適切に取得できていること
     Failure/Error: expect(response.body).to include product.name
     
     NoMethodError:
       undefined method 'body' for nil:NilClass
     #./spec/requests/products_spec.rb:19:in 'block (3 levels) in <top (required)>'

Finished in 1.84 seconds (files took 6.19 seconds to load)
2 examples, 2 failures

Failed examples:
rspec./spec/requests/products_spec.rb:8 # Products GET /products returns http success
rspec./spec/requests/products_spec.rb: 18 # Products GET/products 商品名が適切に取得できていること

エラー文を読むと「ステータス200番台を期待していたが500番になった」ということのようです。ローカル環境では問題なく表示できているのですが…
500エラーについて調べてみても内部サーバーエラーということで具体的な原因・解決法がわかりませんでした。

試したこと・考えたこと

その1

テストデータがうまく作成できていないのでは?と思い、binding.pryを挟んで調べてみました。
1F9FAA8D-586C-4F59-94BF-A25B5EB2901A_1_201_a.jpeg

どうやらテストデータは問題なく作成できているようです。

その2

試しにスペックファイルの記述を下記のように変更してみました。

spec/requests/product_spec.rb
   it "returns http success" do
      get root_path  ←ここを変更
      binding.pry
      expect(response).to have_http_status(:success)
    end

その結果

Failures:

  1) Products GET /products 商品名が適切に取得できていること
     Failure/Error: expect(response.body).to include product.name
     
     NoMethodError:
       undefined method 'body' for nil:NilClass
     # ./spec/requests/products_spec.rb:15:in 'block (3 levels) in <top (required)»'

Finished in 1.86 seconds (files took 6.18 seconds to load)
2 examples, 1 failure

Failed examples:
rspec./spec/requests/products_spec.rb:14 # Products GET /products 商品名が適切に取得できていること

500エラーは出ていません。
ということはget product_path(product.id)の部分に問題がある?

その3

上記を確かめるためにbinding.pryを挟んで確認してみました。
54B6CECE-2DF5-4FEF-AB83-523B5B37313D_4_5005_c.jpeg

product_path(product.id)は問題なく受け取れていそうです。
そこでresponseの中身をpryで確認したところ「サーバーで問題が発生しているためページを表示できません。」との表示がありました。(長いので内容は割愛)
→画面遷移はできているがテストデータをうまく受け取れていない?

解決へ

スクールのメンターさんに質問したところ、テストに使用しなくてもviewで使用しているデータをテストデータとして作成しておかないとエラーになってしまうとご回答頂きました。

これを受けて商品画像(product.images)と商品カテゴリー(product.taxons)のテストデータを作成し、テストを実行したところ無事500エラーが解消されました。

感想

「ないデータ」を表示しようとするとエラーが出てしまうのは今考えると納得できるのですが、自分だけでは絶対気づけなかっただろうな…と思います。
この後いくつかリクエストスペックを書きましたが、この経験が役に立ったので最初にハマっておいて良かったかもしれません。

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