Django 如何测试消息是否已发送

ais*_*baa 5 testing django

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

存储消息的代码:

messages.success(request, _('Internationalized evil message.'))
Run Code Online (Sandbox Code Playgroud)

应测试消息的代码:

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)
Run Code Online (Sandbox Code Playgroud)

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


@Tisho回答后更新

消息应该可以在 中找到response.context,甚至我的直觉说它应该有效,但事实并非如此。我已将其放入import pdb; pdb.set_trace()django/contrib/messages/context_processors.py 中以查看其是否在测试期间被调用client.post,否则不会。

我已经仔细检查过TEMPLATE_CONTEXT_PROCESSORS,MIDDLEWARE_CLASSES并且INSTALLED_APPS- 也许明天我会发现我错过了一些东西。


重要细节

忘记提及,如果成功提交,视图将返回HttpResponseRedirect,因此response.context为空。


解决方案

View 返回重定向(没有上下文数据),为了解决这个问题,我们可以传递follow=True给 client.post 方法(@Tisho 建议的方法)。

Tis*_*sho 6

在单元测试期间,可以在以下位置找到该消息:

response = self.client.post(
    reverse('evil.views.evil_data_submit'), self.valid_data)
messages = response.context['messages']
Run Code Online (Sandbox Code Playgroud)

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

response = self.client.post(
    reverse('evil.views.evil_data_submit'),
    self.valid_data,
    follow=True)
Run Code Online (Sandbox Code Playgroud)