背景
モデルの操作などで、冪等性をテストしたいけどベストプラクティスがわからない。
例えば
model_spec.rb
describe Model, type: :model do
describe '.do_something' do
subject { Model.do_something }
context 'execute twice' do
it 'not duplicate records' do
subject
expect{ subject }.to change{ Model.count }.by(0)
end
end
end
end
↑これだと、
subjectはひとつのexample内ではメモ化されるので複数回実行されない。
解決策
1. subjectの中身をexample内にべた書きする
model_spec.rb
describe Model, type: :model do
describe '.do_something' do
subject { Model.do_something }
context 'execute twice' do
it 'not duplicate records' do
Model.do_something
expect{ subject }.to change{ Model.count }.by(0)
end
end
end
end
ただ、見通しも悪くなるし
subjectの中身が複数行の場合や、3回以上実行したい場合に行数が増えすぎる問題がある
## 2. subjectの中身をメソッドに定義する
model_spec.rb
describe Model, type: :model do
describe '.do_something' do
subject { model_do_something }
def model_do_something
Model.do_something
end
context 'execute several times' do
it 'not duplicate records' do
model_do_something
model_do_something
model_do_something
model_do_something
expect{ subject }.to change{ Model.count }.by(0)
end
end
end
end
これがベストな気がする。
もっとスマートなやり方があったら教えてください