テスト自体は通っていたが、プルリクを出す前にRuboCopを動かして検証したところ、Lint/AmbiguousBlockAssociationという以下のLintエラーが発生した。
Lint/AmbiguousBlockAssociation: Parenthesize the param change{ analysis.foo_count } to make sure that the block will be associated with the change method call.
require 'rails_helper'
RSpec.describe Dummy, type: :model do
describe '.method' do
subject { Dummy.method!(foo_analysis: analysis, foo_data: foo_data) }
let(:analysis) { create :users_foo_analysis }
context 'when foo_data is empty' do
let(:foo_data) { [].to_json }
it { is_expected.to eq Dummy.none }
it { expect { subject }.to_not change{ analysis.foo_count } }
end
動作しない前提で、試しに以下のように変更をかけてテストを動作させてみた。
■変更箇所
it { expect { subject }.to_not change{ analysis.foo_count } }
it { expect { subject }.to_not change analysis.foo_count }
すると、以下のようなエラーが表示された。
ArgumentError:
`change` requires either an object and message (`change(obj, :msg)`) or a block (`change { }`). You passed an object but no message.
(change { }
)の形式ではRuboCopに怒られてしまっていたので、(change(obj, :msg)
)の形式に修正した形でテストを通しつつ、RuboCopに怒られないようにするためにどうすれば良いか調査してみた。
結論、以下のような記述であれば、テストを通しつつ、RuboCopに怒られずにすんだ。
it { expect { subject }.to_not change(analysis, :foo_count) }
change(obj, :msg)
の:msgって何だろう?と戸惑ったが、普通にメソッドを渡せば動きそうだなと思い、試しにやってみたら上手くいった。
:msgとかではなく、もっと分かりやすいエラーメッセージなら素早く解決できたのに。。。。