How do I mock a django signal handler?

后端 未结 7 1627
走了就别回头了
走了就别回头了 2020-12-14 00:22

I have a signal_handler connected through a decorator, something like this very simple one:

@receiver(post_save, sender=User, 
          dispatch_uid=\'myfil         


        
7条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-14 00:48

    In django 1.9 you can mock all receivers with something like this

    # replace actual receivers with mocks
    mocked_receivers = []
    for i, receiver in enumerate(your_signal.receivers):
        mock_receiver = Mock()
        your_signal.receivers[i] = (receiver[0], mock_receiver)
        mocked_receivers.append(mock_receiver)
    
    ...  # whatever your test does
    
    # ensure that mocked receivers have been called as expected
    for mocked_receiver in mocked_receivers:
        assert mocked_receiver.call_count == 1
        mocked_receiver.assert_called_with(*your_args, sender="your_sender", signal=your_signal, **your_kwargs)
    

    This replaces all receivers with mocks, eg ones you've registered, ones pluggable apps have registered and ones that django itself has registered. Don't be suprised if you use this on post_save and things start breaking.

    You may want to inspect the receiver to determine if you actually want to mock it.

提交回复
热议问题