Макет или исправление переменной экземпляра класса в Python? - PullRequest
1 голос
/ 20 октября 2019

Итак, у меня есть класс S3 в файле / s3.py со следующим init:

class S3:
    def __init__(self):
        self.s3_client = boto3.client("s3")

    def get_object(self):
        s3_object = self.s3_client.get_object()
        return s3_object

Как видите, класс boto3.client также имеет метод с именем get_object(). Я тестирую свой пользовательский метод get_object() из другого файла, но не хочу на самом деле совершать вызов boto3.client сервисам AWS.

test.py

class TestS3Class(unittest.TestCase):
    """TestCase for file/s3.py"""

    def setUp(self):
        """Creates an instance of the live S3 class for testing"""
        self.s3_test_client = S3()

    @patch('boto3.client')
    def test_get_object(self, mock_client):
        """"""
        mock_client.get_object.return_value = {'key': 'value'}
        self.assertIsInstance(self.s3_test_client.get_object(), dict)

НаВ тот момент, когда я получаю AssertionError: None is not an instance of <class 'dict'> в качестве ответа, я не уверен, что я что-то исправляю или нет, но он определенно не устанавливает возвращаемое значение boto3.client.get_object () в объект словаря.

Любые советы о том, как издеваться над этим self.s3_client = boto3.client ()?

1 Ответ

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

boto3.client возвращает экземпляр динамически создаваемого класса на основе первого аргумента (см. source ), поэтому вы не можете использовать метод patch, который требует, чтобы целевой объект был импортируемым.

Вместо этого вы можете обезьянько-патчить атрибут get_object объекта класса клиента с помощью объекта Mock, который при желании возвращает желаемый dict:

class TestS3Class(unittest.TestCase):
    def setUp(self):
        self.s3_test_client = S3()
        self.s3_test_client.s3_client.__class__.get_object = Mock(return_value={'key': 'value'})

    def test_get_object(self):
        self.assertIsInstance(self.s3_test_client.get_object(), dict)

Demo:https://repl.it/@blhsing/MarriedDeficientNumerator

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