django: mock post_save обработчик сигналов?

tests.py

from unittest.mock import patch

from orders.models import Order

class OrderModelTest(CartSetupTestCase):

    def test_string_representation(self):
        # Mocking Order's post_save signal
        with patch('orders.signals.post_save_order', autospec=True) as mocked_handler:
            post_save.connect(
                mocked_handler,
                sender=Order,
                dispatch_uid='test_cache_mocked_handler'
            )
            order = Order.objects.create(
                user=self.user,
                merchant_uid="1475633246629",
                customer_name="asd",
                address="주소",
                address_detail="asdfdsa",
                postal_code="12345",
                phone_number="01095104344",
                possible_date_start="2011-11-24",
                possible_date_end="2011-11-24",
                possible_time_start="11:22 AM",
                possible_time_end="11:22 AM",
                total_price=self.cart.total_price,
            )

signals.py

@receiver(post_save, sender=Order, dispatch_uid="spacegraphy")
def post_save_order(sender, instance, created, **kwargs):
    if created:
        SlackNotification.objects.create(
            receiver="order_web",
            content="asdfasdf"
        )

Я последовал за ним. https://stackoverflow.com/a/13119150/3595632 , но он не работает, что означает, что он вызвал обработчик сигнала в реальном! (Я проверил его, используя print())

Что-то не так?

1 ответ

  1. FWIW я последовал тому же, но нужно было издеваться над send_task сельдерея . После прочтения, я понял, что сигналы ценны и не должны быть высмеяны (это желаемое действие, чтобы стрелять в них, не так ли?), поэтому решение было в том, чтобы имитировать то, что происходило внутри сигнала (связь с внешними службами). В целом, я бы предложил:

    from unittest.mock import patch
    from orders.models import Order
    
    class OrderModelTest(CartSetupTestCase):
    
        @patch('orders.signals.SlackNotification.objects.create')
        def test_string_representation(self, create):
            order = Order.objects.create(
                user=self.user,
                merchant_uid="1475633246629",
                customer_name="asd",
                address="주소",
                address_detail="asdfdsa",
                postal_code="12345",
                phone_number="01095104344",
                possible_date_start="2011-11-24",
                possible_date_end="2011-11-24",
                possible_time_start="11:22 AM",
                possible_time_end="11:22 AM",
                total_price=self.cart.total_price,
            )
            self.assertEquals(1, create.call_count)