Порядок при объединении @ mock.patch по классу и методам - PullRequest
0 голосов
/ 03 марта 2020

Когда метод должен быть смоделирован в тестовом примере, можно применить декоратор @mock.patch в каркасе python unittest (см. 1 ):

    class MyTest(TestCase):
        @patch('method2')
        @patch('method1')
        def test_stuff(self, mock_method1, mock_method_2):
            ...

Согласно документам 2 , также можно применять @mock.patch в качестве декоратора класса:

    @patch('method2')
    @patch('method1')
    class MyTest(TestCase):
        def test_stuff(self, mock_method_1, mock_method_2):
            ...

Так что также должно быть возможно и разумно объединить эти два подходы:

    @patch('method1')
    class MyTest(TestCase):
        @patch('method2')
        def test_stuff(self, mock_method_A, mock_method_B):
            ...

Теперь мне было интересно, в каком порядке макеты передаются test_stuff. Так же mock_method_A макет method1 или method2?

1 Ответ

0 голосов
/ 03 марта 2020

Насмешки из метода декоратора применяются перед декоратором класса. Т.е. mock_method_A - это макет для method2, а mock_method_B - это макет для method1

См. Этот автономный пример для иллюстрации:

from unittest import TestCase, main, mock


def method1():
    return 1


def method2():
    return 2


@mock.patch('test.method2', return_value='method2')
@mock.patch('test.method1', return_value='method1')
class TestClassDecoratorOrder(TestCase):
    def test_order(self, mock_method1, mock_method2):
        self.assertEqual(mock_method1(), 'method1')
        self.assertEqual(mock_method2(), 'method2')


class TestMethodDecoratorOrder(TestCase):
    @mock.patch('test.method2', return_value='method2')
    @mock.patch('test.method1', return_value='method1')
    def test_order(self, mock_method1, mock_method2):
        self.assertEqual(mock_method1(), 'method1')
        self.assertEqual(mock_method2(), 'method2')


@mock.patch('test.method2', return_value='method2')
class TestCombinedDecoratorOrder(TestCase):
    @mock.patch('test.method1', return_value='method1')
    def test_order(self, mock_method1, mock_method2):
        self.assertEqual(mock_method1(), 'method1')
        self.assertEqual(mock_method2(), 'method2')


if __name__ == "__main__":
    main()

...