Тест TDD показывает ошибку, даже если ответ правильный - PullRequest
0 голосов
/ 07 октября 2018

Я следую учебному пособию об 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 / list-info.yml') def test_listings_info (перечисление_keys): "" "проверкавызов API для получения списков "" "lists_instance = листингов (648597757) response = Listings_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 Ответ

0 голосов
/ 07 октября 2018

Тест не пройден, поскольку в ответе JSON нет ключа id, а в URL нет.Вы всегда должны использовать dict.get(key) для извлечения значений из dict, так как dict[key] выдает KeyError, если key не в dict.

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