Тест TDD показывает ошибку, даже если ответ правильный
Я слежу за учебником по API здесь и следую за точным кодом, и я также адаптирую код для приложения Etsy, вот мой код для второго теста, код учебника идентичен учебнику и работает. Следующий код был адаптирован для работы с Etsy APi.
#etsywrapper/__core.py
from . import session
class Listings(object):
def __init__(self, id):
self.id = id
def info(self):
path = 'https://openapi.etsy.com/v2/listings/{}/inventory'.format(self.id)
response = session.get(path)
return response.json()
@staticmethod
def active():
path = 'https://openapi.etsy.com/v2/shops/:shop_id/listings/active'
response = session.get(path)
return response.json()
а также
#etsywrapper/__init__.py
import os
import requests
ETSY_API_KEY = os.environ.get('ETSY_API_KEY', None)
class APIKeyMissingError(Exception):
pass
if ETSY_API_KEY is None:
raise APIKeyMissingError(
"All methods require an API key. See "
"https://developers.themoviedb.org/3/getting-started/introduction "
"for how to retrieve an authentication token from "
"The Movie Database"
)
session = requests.Session()
session.params = {}
session.params['api_key'] = ETSY_API_KEY
from .__core import Listings
а также
#tests/test_etsywrapper.py
from pytest import fixture
from etsywrapper import Listings
import vcr
@fixture
def listing_keys():
# Responsible only for returning the test data
return ['listing_id']
@vcr.use_cassette('tests/vcr_cassettes/listing-info.yml')
def test_listings_info(listing_keys):
"""test api call to get listings"""
listings_instance = Listings(648597757)
response = listings_instance.info()
assert isinstance(response, dict)
assert response['id'] == 648597757, "id should be in response"
assert set(listing_keys).issubset(response.keys()), "All keys should be in the response"
@vcr.use_cassette('tests/vcr_cassettes/listings_active.yml')
def test_listings_active():
"""tests shop active listings"""
response = Listings.active()
assert isinstance(response, dict)
assert isinstance(response['results'], list)
assert isinstance(response['results'][0], dict)
assert set(listing_keys()).issubset(response['results'][0].keys())
Затем я запускаю тесты с "ETSY_API_KEY='my_api_code_here' py.test". Результаты теста показывают, что у меня ошибка в первом тесте, но когда я смотрю на результаты в файле vcr, тест прошел нормально с URL, как я хочу, вот подробности ошибки с терминала
______________________________ test_listings_info _________________________listing_keys = ['перечисление_id'] @vcr.use_cassette('tests/vcr_cassettes/ перечисление-info.yml') def test_listings_info(перечисление_keys): """вызов API api для получения списков""" lists_instance = списков (64859) response = lists_instance.info() assert isinstance(response, dict) assert response['id'] == 648597757, "id должен быть в ответе" E KeyError: 'id' tests/test_etsywrapper.py:18: KeyError
и вот URL, который я ожидал
https://openapi.etsy.com/v2/listings/648597757/inventory?api_key="my_api_key"
Как вы можете видеть, в тесте ожидается ожидаемое число "id", но тест не может его увидеть. жизненно важно, чтобы тест был правильным, кто-нибудь может увидеть ошибку в моем коде? В начале я сказал, что следовал учебному пособию, которое у меня есть. Этот код здесь не показан, но он идентичен учебному пособию и работает во всех тестах.
1 ответ
Тест не пройден, потому что нет id
введите ответ JSON, а не URL. Вы должны всегда использовать dict.get(key)
извлекать значения из dict, используя dict[key]
выдает KeyError, если key
не в диктанте.