Ложные запросы / ответы, у ложного объекта нет атрибута 'url' - PullRequest
0 голосов
/ 15 октября 2019

Я новичок в издевательской библиотеке, и пока она доставляет мне неприятности. Я пытаюсь протестировать метод парсинга Url, который получает ответ от initialUrl, который затем анализируется в методе. Я установил autospec=true, поэтому я думаю, что он должен иметь доступ ко всем методам в библиотеке запросов (включая response.url). Я пытаюсь смоделировать как get, так и response, хотя я не уверен, нужно ли это?

Мой метод getUrl, который принимает ответ и возвращает его проанализированное содержимое:

def getUrl(response):
    if response.history:
        destination = urllib.parse.urlsplit(response.url)

        baseUrlTuple = destination._replace(path="", query="")
        return urllib.parse.urldefrag(urllib.parse.urlunsplit(baseUrlTuple)).url

    raise RuntimeError("No redirect")

Метод теста:

def testGetUrl(self):
    initialUrl = 'http://www.initial-url.com'
    expectedUrl = 'http://www.some-new-url.com'

    mock_response = Mock(spec=requests, autospec=True)
    mock_response.status_code = 200
    mock_get = Mock(return_value=mock_response)
    #mock_get.return_value.history = True
    resp = mock_get(self.initialUrl)
    mock_response.history = True
    resultUrl = getBaseUrl(resp)
    self.assertEqual(resultUrl, expectedUrl)

Когда я запускаю тест, я получаю

    raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'url'

1 Ответ

0 голосов
/ 15 октября 2019

Сначала я бы исправил код в вашем вопросе, чтобы он действительно работал.

У вас есть несколько вариантов, самым простым из которых является добавление url в список атрибутов, которые вы издеваетесь:

mock_response.url = <your URL>

Но также важно понимать, что вы пытаетесьиспользуйте библиотеку запросов в качестве спецификации для макета, когда вам следует использовать requests.Response(), если вы хотите, чтобы атрибут url создавался автоматически. Вы все равно должны назначить ему любой URL, который хотите использовать, или вы будете сравнивать объект Mock с int в вашей функции.

Если вы хотите изучить документацию, посмотрите документацию по спецификации. больше: https://docs.python.org/3/library/unittest.mock-examples.html

...