はじめに
※rails初心者向けです。
Rspecでテストコードを書いていた時に、 Failure/Error: 〇〇 expected: 1 got: 2 に直面しました。
備忘録として解決法を残しておこうと思います。
やりたかったこと
レコードが存在しない場合に新しくid=1のレコードを作成して保存するようなテストを書こうと思いました。
間違ったコード
createを2回しているため、エラーが起きた。
expect(テーブル名).exists?(1).to be(false)でレコードの中身をnilにして新しくcreateできると思ったが 、id = 2のレコードが作られてしまった。
hoge_spec.rb
describe `PUT /hoge/fuga` do
before do
@hoge = create(:hoge, 1)
end
context 〇〇 do
it 'レコードが存在しない場合新しくid=1のレコードを作成する' do
expect(テーブル名).exists?(1).to be(false)
@hoge = create(:hoge, id: 1)
put ...........
json = Json.parse(response.body)
#レコードが作成されたことの確認
expect (テーブル名).to eq(1)
#保存の確認
hozon = テーブル名.to eq テーブル名.first
end
end
end
解決法
before doで書いていた
@hoge = create(:hoge, id: 1)
を、before doから消し、各テスト項目に書くことで2回作成されることを防いだ。
hoge_spec.rb
describe `PUT /hoge/fuga` do
before do
# 省略(@hoge = create(:hoge, id: 1)は消す)
end
context 〇〇 do
it 'レコードが存在しない場合新しくid=1のレコードを作成する' do
expect(テーブル名).exists?(1).to be(false)
put ...........# 省略
@hoge = create(:hoge, id: 1)
json = Json.parse(response.body)
#レコードが作成されたことの確認
expect (テーブル名).to eq(1)
#保存の確認
hozon = テーブル名.to eq テーブル名.first
end
end
最後に
いけた。