3

残念ながら、私は Soap API と対話する必要があります。それだけでは不十分な場合、API ではパラメーターの順序付けがオンになっています。つまり、XML であるという事実に関係なく、正しい要素順序で構造化する必要があります。

私は Savon を使用しているので、順序付きハッシュを作成しています。ただし、いくつかのリファクタリングの後、実際の呼び出しは機能しなくなりましたが、すべてのテストは引き続き成功しました。典型的なテストは次のようになります。

it 'should receive correctly ordered hash' do
  example_id = 12345789
  our_api = Example::ApiGateway.new()
  params = {:message=>{'ApiKey' => api_key, 'ExampleId' => example_id}}
  Savon::Client.any_instance.should_receive(:call).with(:get_user_details, params).and_return(mocked_response())
  our_api.get_user(example_id: example_id)
end

ハッシュ比較はキーの順序をまったく気にしないため、実際に受け取ったハッシュ順序に関係なく、このテストはパスします。メソッドが受け取るパラメーターを取得してcallから、各ハッシュの順序付けられたキーを比較したいのですが、これを行う方法がわかりません。

Savon 呼び出しがメッセージ ハッシュを正しい順序で受信するようにするにはどうすればよいですか?

4

1 に答える 1

2

それで、次のグーグルで答えを見つけました。should_receiveブロックを取ることができるので、テストを次のように再構築できます

it 'should receive correctly ordered hash' do
  example_id = 12345789
  our_api = Example::ApiGateway.new()
  params = {:message=>{'ApiKey' => api_key, 'ExampleId' => example_id}}
  Savon::Client.any_instance.should_receive(:call){ |arg1, arg2|
     arg1.should eq(:get_user_details)
     #Ensure order here manually
     arg2[:message].keys.should eq(params[:message].keys)
     mocked_response()
  }
  our_api.get_user(example_id: example_id)
end

これで、キーがめちゃくちゃになったときに私のテストが予想どおりに壊れ、他の人の脆弱なコードを回避するためにさらに多くの時間を費やすことができます...

于 2013-11-11T04:16:05.177 に答える