スペックファイルをできるだけきれいに保つために一生懸命働いています。「shoulda」gem を使用し、同じパターンに従うカスタマイズされたマッチャーを記述します。
私の質問は、ラップexpect{ post :create ... }.to change(Model, :count).by(1)
され、他の「すべき」マッチャーと同じサンプルグループで使用できるカスタムマッチャーを作成することです。詳細は以下のとおりです。
カスタムマッチャー (簡略化)
RSpec::Matchers.define :create_a_new do |model|
match do |dummy|
::RSpec::Expectations::ExpectationTarget.new(subject).to change(model, :count).by(1)
end
end
実施例
describe 'POST create:' do
describe '(valid params)' do
subject { -> { post :create, model: agency_attributes } }
it { should create_a_new(Agency) }
end
end
ラムダを使用しsubject
、私のマッチャーがサンプルグループの唯一のものである限り、これは問題なく機能します。
失敗例
失敗例 1
同じグループにさらに例を追加するsubject
と、コントローラーのインスタンスではなくラムダになるため、他のマッチャーが失敗します。
describe 'POST create:' do
describe '(valid params)' do
subject { -> { post :create, model: agency_attributes } }
it { should create_a_new(Agency) }
it { should redirect_to(Agency.last) }
end
end
失敗例 2
「shoulda」マッチャーはbefore
ブロックを定義することを期待していますが、これはカスタムマッチャーと互換性がありません
describe 'POST create:' do
describe '(valid params)' do
before { post :create, agency: agency_attributes }
it { should create_a_new(Agency) }
it { should redirect_to(Agency.last) }
end
end
期待される結果
他のマッチャーと同じサンプル グループに収まるカスタム マッチャーを作成する方法を探しています。つまり、カスタム マッチャーはbefore
ブロックを使用してコントローラー アクションを実行する必要があります。上記の「失敗した例 #2」がその方法です。私のスペックを書くのが好きです。出来ますか?
読んでくれてありがとう