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)