Как написать работающие заглушки Webmock с вложенными данными? - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь написать тесты rspec.Некоторым из них необходимо заблокировать вызовы внешней службы.

Некоторые из этих вызовов отправляют вложенные данные, и эти данные никогда не обрабатываются Webmock правильно.

describe 'calc' do
  before do
    stub_request(:any, url).with(body: hash_including(operation: 'calc'))
  end

  it 'works' do
    request_data = { sale_type: 'money', cover_type: 'money', 
                     region: 'rf', period: 9,
                     adults: 600, children: 750, mice: 500 }

    # This thing makes a HTTP request:
    MiteService.new(login_params).calc(request_data)

    expected_body = { operation: 'calc', product: 'mite3', 
                      sessionID: session, data: request_data }
    expect(WebMock).to have_requested(:post, url).with(body: expected_body)
  end
end

Ожидается, что этот тест ожидаетсяпройти.Вызов службы HTTP, выполненный службой, кажется правильным, но Webmock не может прочитать вложенные данные (в данном случае это data часть тела).

1) MiteService API calls calc works
 Failure/Error: expect(WebMock).to have_requested(:post, url).with(body: expected_body)

   The request POST http://example.com/api with body {"data"=>{"sale_type"=>"money", "cover_type"=>"money", "region"=>"rf", "period"=>9, "adults"=>600, "children"=>750, "mice"=>500}, "operation"=>"calc", "product"=>"mite3", "sessionID"=>"123"} was expected to execute 1 time but it executed 0 times

   The following requests were made:

   <...>
   POST http://example.com/api with body 'operation=calc&product=mite3&sessionID=123&data=%7B%3Asale_type%3D%3E%22money%22%2C+%3Acover_type%3D%3E%22money%22%2C+%3Aregion%3D%3E%22rf%22%2C+%3Aperiod%3D%3E9%2C+%3Aadults%3D%3E600%2C+%3Achildren%3D%3E750%2C+%3Amice%3D%3E500%7D' with headers {'Accept'=>'*/*', 'Content-Type'=>'application/x-www-form-urlencoded', 'Date'=>'Tue, 25 Dec 2018 08:20:32 GMT', 'User-Agent'=>'HTTPClient/1.0 (2.8.3, ruby 2.4.1 (2017-03-22))'} was made 1 time

1 Ответ

0 голосов
/ 26 декабря 2018

Сделал так, чтобы это работало для этого примера путем преобразования полей в json в спецификации примера.

expect(WebMock).to have_requested(:post, url).with(body: expected_body.to_json)
...