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 回答