Rspec、キーと値のペアのサブセットのみを受信するとどうやって期待できますか?

概要

クラスがいくつかの引数を持つメソッドを受け取ることを期待する仕様があります。引数 hash からキーと値のペアのサブセットを確認したいだけです。

  it 'calls Stripe::Checkout::Session#create with the correct line items' do
      expect(Stripe::Checkout::Session).to receive(:create).with({
          line_items: [{
            price: "bla",
            quantity: 1
          }],
        }
      )
      subject
    end

ここでは、引数ハッシュに line_items が正しい値で存在することを確認したいだけです。

ただし、実際に受信したハッシュにはさらに多くの値が含まれており、次のエラーが発生します。

#<Stripe::Checkout::Session (class)> received :create with unexpected arguments
     expected: ({:line_items=>[{:price=>"bla", :quantity=>1}]}, *(any args))
          got: ({:allow_promotion_codes=>true, :automatic_tax=>{:enabled=>true}, :billing_address_collection=>"requir...vh.me/fr/thank-you?checkout_session_id={CHECKOUT_SESSION_ID}", :tax_id_collection=>{:enabled=>true}}, {:stripe_account=>"bla"})

キーと値のペアのサブセットの存在のみをチェックするように rspec に指示するにはどうすればよいですか?

解決策

ハッシュのサブセットと一致する hash_include が必要です。

  ...to receive(:create).with(hash_including(
    line_items: [{
      price: "bla",
      quantity: 1
    }],
  )

ドキュメントを参照してください: https://relishapp.com/rspec/rspec-mocks/v/3-2/docs/setting-constraints/matching-arguments