Как проверить, вызывается ли функция при выполнении другой функции в django test?

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

from unittest import mock

# Customer Manager class
class ItemsManager(models.Manager):

    def bulk_update(self, *args, **kwargs):
        result = super().bulk_update(*args, **kwargs)
        items_bulk_updated(*args, **kwargs)
        return result


# signals.py file
def items_bulk_updated(*args, **kwargs):
    print("items bulk updated")


# test file
# Base TestCase Inherits from APITestCase
class TestItems(BaseTestCase):

    @mock.patch("items.signals.items_bulk_updated",autospec=True)
    def test_bulk_update_items_triggers_signal(self, mock_function):
        items_qs = Items.objects.all()
        result = Items.objects.bulk_update(items_qs, ['item_name'])
        mock_function.assert_called()

Предполагаю, что функция, которую вы хотите проверить, это items_bulk_updated.

Поскольку вы тестируете ItemsManager.bulk_update() и хотите проверить, что items_bulk_updated вызывается внутри этого метода, путь в вашем @mock.patch должен быть путем к файлу, в который импортируется функция, а не ее источником. Это означает, что вам нужно обновить

@mock.patch("items.signals.items_bulk_updated", autospec=True)

to

@mock.patch("<path-to-items-manager-file>.items_bulk_updated", autospec=True)

где <path-to-items-manager-file>, как и предполагалось, является путем к вашему ItemsManager классу.

Вернуться на верх