4

スペックファイルをできるだけきれいに保つために一生懸命働いています。「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」がその方法です。私のスペックを書くのが好きです。出来ますか?

読んでくれてありがとう

4

1 に答える 1