Как использовать одни и те же декораторы для более чем одной функции в python? - PullRequest
2 голосов
/ 02 апреля 2020

Я тестирую в django и использую decorator mock.patch.object () для методов насмешливых объектов. Я хочу использовать те же декораторы в другой функции этого класса. Для этого я переместил декораторы из функции в класс. Это решило мою проблему, но теперь я хочу добавить еще одну тестовую функцию, которая не должна насмехаться над этими функциями.

@mock.patch.object(MyClass, 'class_fun_2')
@mock.patch.object(MyClass, 'class_fun_1')
class TestClass(testcases.TestCase):
    def setUp(self):
    # contains my setup that I want to use in all functions for this test class

    def test_function_1(self, mocked_class_fun_1, mocked_class_fun_2):
    # I want to use those mocked functions here

    def test_function_2(self, mocked_class_fun_1, mocked_class_fun_2):
    # I want to use those mocked functions here too

    def test_function_3(self):
    # I do not want to use those mocked functions here

Если я это сделаю, выдается ошибка:

TypeError: test_function_3() takes 1 positional argument but 3 were given

Так что же мне делать, чтобы я мог использовать setUp во всех функциях и смоделированные функции только в двух функциях?

PS: я показал только 2 смоделированные функции, но на самом деле я имитирую 8 функций, поэтому повторение mock.patch может быть не очень хорошей идеей.

1 Ответ

3 голосов
/ 02 апреля 2020

Создайте родительский тестовый класс без декораторов - TestParent, который содержит код из вашего setUp метода, затем наследуйте от этого класса в двух подклассах - один с декорированием, а другой - с:

class TestClassParent(testcases.TestCase):
    def setUp(self):
        # contains my setup that I want to use in all functions for this test class

@mock.patch.object(MyClass, 'class_fun_2')
@mock.patch.object(MyClass, 'class_fun_1')
class TestClassMocked(TestClassParent):
    def test_function_1(self, mocked_class_fun_1, mocked_class_fun_2):
        # I want to use those mocked functions here

    def test_function_2(self, mocked_class_fun_1, mocked_class_fun_2):
        # I want to use those mocked functions here too

class TestClassNotMocked(TestClassParent):
    def test_function_3(self):
        # I do not want to use those mocked functions here

Это позволит вам поделиться кодом настройки и указать, какие методы не должны быть смоделированы.

...