はじめに
この記事では、学習中に出会ったエラーとその解決までの道のりを自分のために記録しています。
初学者のため理解が不十分なところがあるかもしれません。その場合はご指摘いただけると幸いです。
起こった問題
Solidusを使用してECサイトを作成中、Rspec(リクエストスペック)を実行したところ500エラーが返ってきた
結論
テストに使用しない場合でもviewで使用しているデータはテストデータとして作成しておく
解決までの道のり
前提条件
- Solidusに予め用意されているテストデータを使用
- viewには商品カテゴリーのパンくずリスト、商品画像、商品名、金額を表示
発生したエラー
スペックファイルは下記のように記述
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を挟んで調べてみました。
どうやらテストデータは問題なく作成できているようです。
その2
試しにスペックファイルの記述を下記のように変更してみました。
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を挟んで確認してみました。
product_path(product.id)は問題なく受け取れていそうです。
そこでresponseの中身をpryで確認したところ「サーバーで問題が発生しているためページを表示できません。」との表示がありました。(長いので内容は割愛)
→画面遷移はできているがテストデータをうまく受け取れていない?
解決へ
スクールのメンターさんに質問したところ、テストに使用しなくてもviewで使用しているデータをテストデータとして作成しておかないとエラーになってしまうとご回答頂きました。
これを受けて商品画像(product.images)と商品カテゴリー(product.taxons)のテストデータを作成し、テストを実行したところ無事500エラーが解消されました。
感想
「ないデータ」を表示しようとするとエラーが出てしまうのは今考えると納得できるのですが、自分だけでは絶対気づけなかっただろうな…と思います。
この後いくつかリクエストスペックを書きましたが、この経験が役に立ったので最初にハマっておいて良かったかもしれません。