Модульное тестирование Python запроса, который не удается - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь проверить http-вызов, который должен быть неудачным, но я хочу вернуть значение. Однако тест, который я не прошел в покрытии:

    def callAPI(self, tokenURL:str):
    requestBuilder: RequestBuilder = RequestBuilder()

    try:
        response = requestBuilder.get(tokenURL)
        return response.json()
        # return "content"
    except Exception as err:
        Logger.error("An error occured while trying to call API "+ err)
        return None

Это моя тестовая функция:

@responses.activate
def testCallDemFails():
  responses.add(
    responses.GET, 'http://calldem.com/api', json="{'err'}", status=500)

  with pytest.raises(Exception):
    demConfig = DemConfig()
    resp = demConfig.callAPI('http://callAPI.com/api/1/foobar')
    print("testCallAPIFail", resp)
    assert resp == None

Метод requestBuilder.get просто возвращает функцию request.get. Когда я выполняю функцию, у меня даже не происходит сбой testAPI. У вас есть идеи?

1 Ответ

1 голос
/ 30 октября 2019

Похоже, что тестовая функция не подключает URL-адрес запроса, который вы используете, к ожидаемому URL-адресу ответа. http://callAPI.com/api/1/foobar не соответствует http://calldem.com/api, и тестовый ответ не настроен как совпадение с регулярным выражением, которое включит сопоставление подпутей, которое подразумевается в примере кода. Я предполагаю, что ответ, возвращаемый неверно сконфигурированным отображением URL, является анализируемым JSON (или нет), поэтому исключение никогда не вызывается.

Если вы попробуете следующий тестовый код, это сработает?:

import re

@responses.activate
def testCallDemFails():
  responses.add(
    responses.GET, re.compile('http://callAPI.com/api/.*'), json="{'err'}", status=500)

  with pytest.raises(Exception):
    demConfig = DemConfig()
    resp = demConfig.callAPI('http://callAPI.com/api/1/foobar')
    print("testCallAPIFail", resp)
    assert resp == None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...