2016-11-07 4 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)