Как макетировать объекты класса Python? - PullRequest
0 голосов
/ 11 мая 2018

Допустим, я следующий класс:

class CompositionClass(object):
    def __init__(self):
        self._redis = Redis()
        self._binance_client = BinanceClient()

    def do_processing(self, data):
        self._redis.write(data)
        self._binance_client.buy(data.amount_to_buy)

        # logic to actually unittest

        return process_val

У меня есть другие объекты, которые вызывают внешний API как композицию в моем ComplexClass.Когда я тестирую логику do_processing, я не хочу вызывать эти дорогостоящие вызовы API.Я проверил полностью в SO и Google о тестировании юнитов;Все примеры просты, но не очень полезны.В моем случае, как я могу использовать unittest.mock, чтобы издеваться над этими объектами?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Один из способов насмешки над классами Redis и BinanceClient заключается в использовании декоратора patch в вашем тестовом классе, например:

from unittest import TestCase
from unittest.mock import patch
from package.module import CompositionClass

class TestCompositionClass(TestCase):

    @patch('package.module.BinanceClient')
    @patch('package.module.Redis')
    def test_do_processing(self, mock_redis, mock_binance):
        c = CompositionClass()
        data = [...]
        c.do_processing(data)

        # Perform your assertions

        # Check that mocks were called
        mock_redis.return_value.write.assert_called_once_with(data)
        mock_binance.return_value.buy.assert_called_once_with(data.amount_to_buy)

Обратите внимание, что путь к @patch - это путь к модулю, содержащему CompositionClass и его импорт для Redis и BinanceClient. Исправление происходит в этом модуле, а не в модуле, содержащем сами реализации Redis и BinanceClient.

0 голосов
/ 11 мая 2018

Вам нужно установить значение, которое должно быть возвращено вашим вызовом API, для этой функции:

from unittest.mock import MagicMock


class Tester(unittest.TestCase):
    def setUp(self):
        pass

    def test_do_processing(self):

        self.API_function = MagicMock(return_value='API_response')
        # test logic
...