Библиотека Python unittest.mock - PullRequest
0 голосов
/ 15 ноября 2018

Я пишу юнит-тесты для библиотеки запросов. Для большинства моих библиотек я запускаю .content.decode('utf-8') в ответе, чтобы получить фактический текст. Однако, когда я высмеиваю этот ответ от вызова API, как я высмеиваю объект ответа, который получен вызовом запросов? есть ли requests.content.encode('utf-8',data)) похожий процесс, который на самом деле может высмеивать ответ, поступающий (в закодированном формате) от вызова API, и затем я декодирую этот объект.

пример кода:

def sample_fct(self, endpoint):
    try:
        request = requests.post (endpoint, verify=False)
    except requests.exceptions.RequestException as e:
        raise
    return request

def get_something(self,test):
    try:
        response = self.sample_fct(test)
        resp_text = response_bare.content.decode('utf-8')
        print resp_text
    except:
        raise 

Так, например, если я хотел провести модульное тестирование функции get_something, мне нужно смоделировать функцию sample_fct. чтобы сделать это, мне нужно установить sample_fct.return_value для объекта запроса, который он возвращает.

Итак, как мне создать этот объект.

1 Ответ

0 голосов
/ 16 ноября 2018

Вот как вы можете высмеивать ответ, как я говорил выше. Обратите внимание, что я взял на себя смелость, чтобы ваш код и мой тест действительно заработали. Они включены в комментарии:

"""request_module.py"""
import requests


class SomeClass(object):
    """I put these in a class, since you had self as your first arg"""
    def sample_fct(self, endpoint):
        try:
            request = requests.post (endpoint, verify=False)
        except requests.exceptions.RequestException as e:
            raise
        return request

    def get_something(self, test):
        try:
            response = self.sample_fct(test)
            resp_text = response.content.decode('utf-8')
            # Changed to return the value instead of print it
            return resp_text
        except:
            raise 

Вы можете увидеть в тесте, как я присваиваю возвращаемое значение вашего смоделированного sample_fct произвольному Mock объекту. Этому объекту могут быть назначены произвольные атрибуты, что может помочь в проверке возвращаемых значений, которые могут иметь много уровней глубины атрибута.

"""test_request_module.py"""
import unittest
import unittest.mock as mock

from request_module import SomeClass

class TestRequests(unittest.TestCase):
    @mock.patch('request_module.SomeClass.sample_fct')
    def test_get_something(self, mock_sample_fct):
        mock_sample_fct.return_value = mock.Mock(content=b'some content you want to decode \xE2\x98\xBA')
        # Testing that your decoded value is returned
        some_class = SomeClass()
        result = some_class.get_something('some_test_value')
        # Note the decoded smiley face
        self.assertEqual('some content you want to decode ☺', result)

Обратите внимание, что вы также можете назначать атрибуты атрибутов для Mock. Поэтому, если ваш абонент ожидает что-то вроде request.attributes.nested_attributes.value, вы можете сделать что-то подобное, и Mock разрешит это:

mock_ret = mock.Mock()
mock_ret.request.attributes.nested_attributes.value = 'deep attr value'
...