python - доступ к объектам, издеваемым с патчем - PullRequest
4 голосов
/ 18 марта 2012

Я использовал библиотеку mock, чтобы провести некоторые тесты. Пока это было здорово, но есть некоторые вещи, которые я еще не до конца понял.

mock обеспечивает хороший способ исправления всего метода, используя patch, и я мог получить доступ к исправленному объекту с помощью метода, подобного так:

@patch('package.module')
def test_foo(self, patched_obj):
    # ... call patched_obj here
    self.assertTrue(patched_obj.called)

Мой вопрос: как мне получить доступ к пропатченному объекту, если я использую декоратор patch для всего класса?

Например:

@patch('package.module')
class TestPackage(unittest.TestCase):

    def test_foo(self):
        # how to access the patched object?

1 Ответ

8 голосов
/ 18 марта 2012

В этом случае test_foo будет иметь дополнительный аргумент, так же как и при декорировании метода.Если ваш метод также пропатчен, то будут добавлены и эти аргументы:

@patch.object(os, 'listdir')
class TestPackage(unittest.TestCase):
    @patch.object(sys, 'exit')
    def test_foo(self, sys_exit, os_listdir):
        os_listdir.return_value = ['file1', 'file2']
        # ... Test logic
        sys_exit.assert_called_with(1)

Порядок аргументов определяется порядком вызовов декораторов.Метод декоратор вызывается первым, поэтому он добавляет первый аргумент.Декоратор класса является внешним, поэтому он добавит второй аргумент.То же самое применяется, когда вы присоединяете несколько декораторов патчей к одному и тому же методу тестирования или классу (т. Е. Внешний декоратор идет последним).

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