测试 Django 信号的正确方法

新手上路,请多包涵

我正在尝试测试发送的信号,它正在提供_args。内部触发的信号 contact_question_create 表单提交后立即查看。

我的测试用例是这样的:

     def test_form_should_post_proper_data_via_signal(self):
        form_data = {'name': 'Jan Nowak'}
        signals.question_posted.send(sender='test', form_data=form_data)
        @receiver(signals.question_posted, sender='test')
        def question_posted_listener(sender, form_data):
            self.name = form_data['name']
        eq_(self.name, 'Jan Nowak')

这是测试此信号的正确方法吗?有更好的主意吗?

原文由 bx2 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 474
2 个回答

我已经自己解决了这个问题。我认为最好的解决方案如下:

     def test_form_should_post_proper_data_via_signal(self):
        # define the local listener
        def question_posted_listener(sender, form_data, **kwargs):
            self.name = form_data['name']

        # prepare fake data
        form_data = {'name': 'Jan Nowak'}

        # connect & send the signal
        signals.question_posted.connect(question_posted_listener, sender='test')
        signals.question_posted.send(sender='test', form_data=form_data)

        # check results
        eq_(self.name, 'Jan Nowak')

原文由 bx2 发布,翻译遵循 CC BY-SA 2.5 许可协议

完成您在 2015 年提出的要求的最简单方法:

 from unittest.mock import patch

@patch('full.path.to.signals.question_posted.send')
def test_question_posted_signal_triggered(self, mock):
    form = YourForm()
    form.cleaned_data = {'name': 'Jan Nowak'}
    form.save()

    # Check that your signal was called.
    self.assertTrue(mock.called)

    # Check that your signal was called only once.
    self.assertEqual(mock.call_count, 1)

    # Do whatever else, like actually checking if your signal logic did well.

这样,您刚刚测试了您的信号是否已正确触发。

原文由 José L. Patiño 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏