教えてもらったこと
``` - テスト(今回の場合controller_spec)に問題があるのではないか? - Factoryに問題がないか? - pathに問題がないか? - paramsに問題がないか?- 実装(今回の場合controller.rb)に問題があるのではないか?
- ストロングパラメータに問題がないか?
- インスタンスは作成されるか?
- インスタンスは保存されるか?(=バリデーションに引っかからないか?)
→ binding.irbをぶちこんで見る
共通:
ログは読む。
- デバッグしながらログの流れを「ちゃんと」見る「ちゃんと!」
<h2>同じテストコードの記述を2回かましてエラーになった</h2>
今回の流れ:
今回の場合、両方(テスト&実装)を確認して特に問題がない
↓
リクエストが2回発生しているのを発見
↓
テストで2回リクエストしている
(テストの書き方の修正が必要)
<h2>ActiveSupport::MessageVerifier::InvalidSignature: また頭真っ白</h2>
```ruby:ターミナルエラー部分
2) Patient::Ostomies ログインしている場合 PATCH /patient/ostomies/:id 更新する
Failure/Error: if @ostomy.update(ostomy_params)
ActiveSupport::MessageVerifier::InvalidSignature:
ActiveSupport::MessageVerifier::InvalidSignature
# /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activestorage-5.2.6/app/models/active_storage/blob.rb:47:in `find_signed'
# /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activestorage-5.2.6/lib/active_storage/attached.rb:30:in `create_blob_from'
# /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activestorage-5.2.6/lib/active_storage/attached/one.rb:24:in `attach'
# /home/ec2-user/.rvm/gems/ruby-2
ログ直下にのactivestorageは画像投稿のgem
デバッグしながらログの流れを見る画像がfactorybotやletで設定されていないため起こったとわかる
今回はバリテーションもかけてないため記述を消した
request/patient_ostomy.rb
RSpec.describe "Patient::Ostomies", type: :request do
let(:patient) { FactoryBot.create(:patient) }
let(:ostomy) { FactoryBot.create(:ostomy, patient: patient) }
context 'ログインしている場合' do
before do
sign_in patient
end
let(:ostomy_params)do
{
patient_id: patient.id,
color: 'pink',
edema: 'normal',
skin: 'same',
h_size: '30 ',
w_size: '30',
comment: 'ok',
#image: '', #ここを消した※バリテーションもかけてないのでOK
}
end
画像にtrueでバリテーションかける場合はletやfacotrybotであらかじめ設定する必要がある。
``` # after(:build) do |dialy| # dialy.attached = fixture_file_upload(Rails.root.join('spec/fixtures/images/no_image.jpeg', 'image/jpeg')) # end ``` https://qiita.com/ratovia/items/c9dbb00e4f663a7a7ef9コントローラーのテスト作成中のエラー
テストコードだけでなく、テストしている部分にもデバックする
```ruby: class Patient::DialiesController < ApplicationController before_action :authenticate_patient! : : def create binding.irb @dialy = Dialy.new(dialy_params) @dialy.patient_id = current_patient.id if @dialy.save redirect_to patient_dialy_path(@dialy) else render :new end end ``` @dialy = Dialy.new(dialy_params)一個ずつ入れてbyebugする