tail -f log/test.log
tail で後方から指定した行数分表示できる ログが見れる
favorite.spec.rb
RSpec.describe "Staff::Favorites", type: :request do
let(:staff){FactoryBot.create(:staff)}
let(:ostomy){FactoryBot.create(:ostomy)}
let(:patient){FactoryBot.create(:patient)}
let(:favorite){FactoryBot.create(:favorite, staff: staff, ostomy: ostomy)}
context 'ログインしている場合' do
before do
@staff = FactoryBot.create(:staff)
sign_in staff
end
let(:ostomy_params)do
{
patient_id: patient.id,
color: 'pink',
edema: 'normal',
skin: 'same',
h_size: '30 ',
w_size: '30',
comment: 'ok',
#image: '',
}
end
describe 'PATCH /staff/ostomies/:ostomy_id/favorites' do
it 'いいねを押す' do
patch staff_ostomy_favorites_path(ostomy, params:{ ostomy:ostomy_params})
# (ostomy, params:{ ostomy:ostomy_params})
favorite.reload
end
end
describe 'DELETE /staff/ostomies/:ostomy_id/favorites' do
it 'いいね取り消す' do
expect{
delete staff_ostomy_favorites_path(ostomy)
}.to change { Favorite.all.count }.by(-1)
end
end
end
end
Staff::Favorites
ログインしている場合
DELETE /staff/ostomies/:ostomy_id/favorites
いいね取り消す (FAILED - 1)
Failures:
1) Staff::Favorites ログインしている場合 DELETE /staff/ostomies/:ostomy_id/favorites いいね取り消す
Failure/Error:
expect{
delete staff_ostomy_favorites_path(ostomy)
}.to change { Favorite.all.count }.by(-1)
expected `Favorite.all.count` to have changed by -1, but was changed by 0
# ./spec/requests/staff/favorite_spec.rb:40:in `block (4 levels) in <top (required)>'
Finished in 0.37761 seconds (files took 2.17 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/requests/staff/favorite_spec.rb:39 # Staff::Favorites ログインしている場合 DELETE /staff/ostomies/:ostomy_id/favorites いいね取り消す
なにでエラーが出てるかわからない
p '-------------' p Favorite.all.countp Favorite.all.count
p '-------------'
を入れて出力させ、状態変化を見た
favorite.spec.rb
describe 'DELETE /staff/ostomies/:ostomy_id/favorites' do
it 'いいね取り消す' do
p '-------------'
p Favorite.all.count
expect{
delete staff_ostomy_favorites_path(ostomy)
}.to change { Favorite.all.count }.by(-1)
p Favorite.all.count
p '-------------'
end
ターミナル
Staff::Favorites
ログインしている場合
DELETE /staff/ostomies/:ostomy_id/favorites
"-------------" ← ← ← ← ← ←ここに結果が出された
0 ← ← ← ← ← ←ここに結果が出された
いいね取り消す (FAILED - 1)
Failures:
1) Staff::Favorites ログインしている場合 DELETE /staff/ostomies/:ostomy_id/favorites いいね取り消す
Failure/Error:
expect{
delete staff_ostomy_favorites_path(ostomy)
}.to change { Favorite.all.count }.by(-1)
expected `Favorite.all.count` to have changed by -1, but was changed by 0
# ./spec/requests/staff/favorite_spec.rb:42:in `block (4 levels) in <top (required)>'
Finished in 0.3563 seconds (files took 2.06 seconds to load)
1 example, 1 failure
Failed examples:
let は@など使わずに済み便利な機能だが、「遅延評価される」ため expect{〜}.to change { Favorite.all.count }が実行された時にlet(:favorite) が実行されず、レコードがデータベースに保存されないためnilを返す。
before ブロックの中で明示的にlet(:favorite)をかく必要がある
favorite.spec.rb
before do
favorite # ここでデータベースにレコードを保存しておく
end
あるいは「 let! 」 を使うことで、実行前に let! で定義した値が作れる 遅延をなくせる
favorite.spec.rb
RSpec.describe "Staff::Favorites", type: :request do
let(:staff){FactoryBot.create(:staff)}
let(:ostomy){FactoryBot.create(:ostomy)}
let(:patient){FactoryBot.create(:patient)}
let!(:favorite){FactoryBot.create(:favorite, staff: staff, ostomy: ostomy)}
↑↑↑ここに↑↑↑↑[!]を入れた let!(: )
tail -f log/test.log