Можно ли написать прибор Pytest уровня функции, который применяет фиктивный декоратор к функции? - PullRequest
2 голосов
/ 24 июня 2019

В нашем репо у нас есть несколько звонков на s3.Мы никогда не хотим, чтобы они выполнялись во время тестирования, поэтому мы макетируем их в каждом отдельном тесте, что раздражает.Это многократно повторяющийся код, и он может быть опасным, если разработчик забывает написать макет перед запуском теста.

Я хотел бы написать приспособление pytest, которое автоматически применяет макет ко всем функциям тестирования.То есть я хочу изменить свой код, чтобы он выглядел следующим образом:

test_file.py:

@mock.patch.object(S3Hook, 'write_to_s3')
def test1(_):
    # test some stuff without writing to s3

@mock.patch.object(S3Hook, 'write_to_s3')
def test2(_):
    # test some more stuff without writing to s3

на это:

conftest.py:

@pytest.fixture(scope='function', autouse=True)
def mock_out_s3(request):
    # somehow apply the mock.patch.object decorator to request.function here


test_file.py:

def test1():
    # test some stuff; the mock is automatically applied, so we won't write to s3

def test2():
    # ditto

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Публикация подробностей о том, как я заставил это работать (на основе ответа ParthS007), чтобы выручить любого, кто пытается сделать то же самое в будущем:

@pytest.fixture(scope='function', autouse=True)
def mock_out_s3(request):
    patcher = mock.patch.object(S3Hook, 'write_to_s3')
    patcher.start()
    request.addfinalizer(patcher.stop)
1 голос
/ 24 июня 2019

При написании этих Unittests.Вы можете сделать это:


Class TestClass(TestCase):

    @classmethod
    def setUpTestData(cls):
        pass

    def tearDown(self):
        self.patcher.stop()

    def setup(self):
       self.patcher = mock.patch(S3Hook, 'write_to_s3')
       mock_apply = self.patcher.start()

    def test1(self):
    # test some stuff; the mock is automatically applied, so we won't write to s3

    def test2(self):
    # ditto


Подробнее о патчере можно узнать здесь: https://docs.python.org/3/library/unittest.mock.html#the-patchers

...