2016-11-07 2 views
0

tests.pydjango: mock post_save обработчик сигнала?

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())

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

+0

Почему бы просто не вызвать функцию с вашим тестом? Чтобы проверить, что сигнал срабатывает, когда что-то создается, это немного связано с тем, что он является основным django. Вы также можете вызвать метод signal.send с соответствующей сигнатурой. – theWanderer4865

+0

@ theWanderer4865 Я не поймал, что ты сказал. Не могли бы вы привести мне пример, пожалуйста? – user3595632

+0

Вы утверждали, что mock_handler был вызван? Когда ваш сигнальный код импортируется (при запуске Django), он регистрирует любое количество обработчиков сигнала - вы должны явно отключить другой обработчик, если вы не хотите его запускать. Есть еще что сказать, но это будет шаг 1. – theWanderer4865

ответ

0

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) 
Смежные вопросы