Как сохранить ответ теста Таверны в файл JSON? - PullRequest
0 голосов
/ 28 июня 2018

Я использую инструмент Tavern для тестирования API и хочу сохранить возвращенный ответ в файле JSON во время выполнения теста, поэтому я использую следующий код в ответ на файл теста yaml:

 response:
    status_code: 200
    save:
      $ext:
        function: tavern_utils:save_response

Функция tavern_utils: save_response ():

def save_response(response):
    with open('saved.json','w') as file:
       json.dump(file,response.json())

Поэтому при выполнении теста с pytest я получаю следующую ошибку:

TypeError: The Object of type 'TextIOWrapper' is not JSON serializable

Как решить эту ошибку или сохранить ответ любым другим способом?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Получил решение: Просто замените функцию save_response следующим:

def save_response(response):
    filename='file4.json'
    with open(filename, 'w') as f:
        json.dump(response.json(), f)

И файл теста Yaml как:

  response:
    status_code: 200
    body:
      $ext:
        function: tavern_utils:save_response            
0 голосов
/ 28 июня 2018

A TextIOWrapper - это открытый текстовый файл, или что-то, что действует как единое целое (в вашем случае это некий объект сетевого ответа). Вы, очевидно, не можете сериализовать это (для сохранения одного и того же объекта потребуется хранить все состояние сервера и сетевое соединение между вами и сервером).

Если вы хотите сериализовать строки в файле в виде списка строк, это просто. Файловый объект является итератором своих строк, поэтому:

list(f)

... дает вам список этих строк.

Если вы хотите сериализовать его как одну гигантскую строку, вы также можете сделать это:

f.read()

Или, если содержимое файла уже является строкой в ​​кодировке JSON, и вы хотите декодировать ее в значение, которое вы можете сериализовать, вы можете json.load это. Но, если вы не делаете это, чтобы подтвердить, что это действительно JSON, это глупо; Вы можете просто прочитать строку JSON в виде строки и записать ее обратно в виде строки, не выполняя никаких операций JSON.

Если вы хотите что-то отличное от любого из них, вам нужно объяснить, что вы пытаетесь сделать, но это, вероятно, выполнимо.

Если вы хотите что-то другое

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...