【问题标题】:Django how to test if message is sentDjango如何测试是否发送消息
【发布时间】:2012-07-12 15:53:30
【问题描述】:

我想测试提交后消息是否发送给用户。我正在使用django.contrib.messages。在手动测试(runserver)期间一切似乎都在工作,但在单元测试中我没有收到消息。

存储消息的代码:

messages.success(request, _('Internationalized evil message.'))

应该测试消息的代码:

from django.contrib.messages.api import get_messages

...

def test_message_should_sent_to_user(self):
    """After successful phone number submit, message should be displayed."""
    response = self.client.post(
        reverse('evil.views.evil_data_submit'), self.valid_data)
    messages = get_messages(response.request)
    self.assertNotEqual(len(messages), 0)

在测试客户端 post 方法调用期间似乎没有调用任何中间件。


在@Tisho answer之后更新

应该在response.context 中找到消息,即使我的直觉说它应该可以工作,但它没有。我已将import pdb; pdb.set_trace() 放在 django/contrib/messages/context_processors.py 中以查看它是否在测试期间调用client.post,它不是。

我已经仔细检查了 TEMPLATE_CONTEXT_PROCESSORSMIDDLEWARE_CLASSESINSTALLED_APPS - 可能明天我会发现我错过了什么。


重要细节

忘了提一下,如果提交视图成功返回 HttpResponseRedirect 因此response.context 为空。


解决方案

视图返回重定向(没有上下文数据),解决我们可以将follow=True传递给client.post方法(@Tisho建议的方法)。

【问题讨论】:

    标签: django testing


    【解决方案1】:

    在单元测试期间,消息可以在

    中找到
    response = self.client.post(
        reverse('evil.views.evil_data_submit'), self.valid_data)
    messages = response.context['messages']
    

    如果您的视图返回重定向,则response.context 将为空,除非您传递follow=True,如下所示:

    response = self.client.post(
        reverse('evil.views.evil_data_submit'),
        self.valid_data,
        follow=True)
    

    【讨论】:

    • 我认为它应该在那里,但它不是:/。
    • 你有不同的单元测试设置文件吗?对我来说似乎是错误的设置。
    • 不,同一个。我什至在cliet.post() 之后的测试中做了pdb.trace() 来检查配置中的内容,一切都符合我的预期。可能我错过了什么。
    • 你用什么MESSAGE_STORAGE
    • 嗯,你说有一个重定向和一个空上下文。你试过self.client.post(reverse('evil.views.evil_data_submit'), self.valid_data, follow=True) 吗?
    【解决方案2】:

    我发现最好的方法是使用模拟

    http://www.voidspace.org.uk/python/mock/patch.html#patch-methods-start-and-stop

    class SimpleCommentTestDirect(TestCase):
    
    def setUp(self):
        self._patcher1 = patch('django.contrib.messages.error')
        self.mock_error = self._patcher1.start()
    
    def tearDown(self):
        self._patcher1.stop()
    
    def test_error_message(self):
        self.client.get('/vote/direct/unknownapp/comment/1/up/')
        self.assertEqual(self.mock_error.call_args[0][1], 'Wrong request. Model.')
    

    顺便说一句:还应该有一种使用模拟获取请求的方法。并通过使用请求对象从 django.contrib.messages.get_messages 获取消息

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 2023-02-11
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 2012-04-04
      相关资源
      最近更新 更多