Gem VCR. Могу ли я хранить данные ответа в отдельном файле JSON?

Используя гем VCR, ответы сохраняются в виде большой строки внутри файла кассеты YAML. Так:

 response:
    body:
      string: '{"data":{"salesforceObjects":{"records":[{"student":{"accountId" ...

Однако можно ли сохранить этот JSON в отдельном файле, который правильно отформатирован и легче читается?


person Marco Prins    schedule 29.10.2020    source источник


Ответы (2)


Из официального документы:

VCR.use_cassette('example', :serialize_with => :json) do
  puts response_body_for(:get, "http://localhost:7777/foo", nil, 'Accept-Encoding' => 'identity')
  puts response_body_for(:get, "http://localhost:7777/bar", nil, 'Accept-Encoding' => 'identity')
end
person Alex Holubenko    schedule 29.10.2020
comment
Какая часть этого фрагмента кода выводит JSON в файл? Я использую seralize_with::json, но все, что это делает, это превращает всю кассету в JSON вместо yaml. Ответ по-прежнему представляет собой уродливую строку. - person Marco Prins; 29.10.2020

Что, если бы вы написали собственный сохранятель кассет, как описано здесь?

https://relishapp.com/vcr/vcr/v/2-9-1/docs/cassettes/cassette-persistence

Вы можете прочитать тело ответа и сохранить его в пользовательском файле. Затем, после считывания, вы добавляете тело ответа, хранящееся на кассете. Это может даже не потребоваться, если вам просто нужна красиво отформатированная копия ответа для справки.

Что-то вроде: (не проверено)

class PrettyCassetteBodyPersister

  # dunno if content is a string or hash. Might be missing some serialization / deserialization
  # might require extra logic to make it work with multiple request cassettes

  def [](name)
    content = YAML.load IO.binread("cassettes/#{name}")
    response_body = JSON.parse IO.binread("cassette_bodies/#{name}")

    content['response']['body'] = response_body
    content
  end

  def []=(name, content)
    IO.binwrite("cassettes/#{name}", content)
    IO.binwrite("cassette_bodies/#{name}", content['response']['body']
  end
end


VCR.configure do |c|

  c.cassette_persisters[:copy_bodies] = PrettyCassetteBodyPersister.new
  c.default_cassette_options = { :persist_with => :copy_bodies }
end
person cesartalves    schedule 29.10.2020