2016-11-07 126 views
0

tests.pydjango:模擬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)