Django如何测试是否发送消息

时间:2012-07-12 15:53:31

标签: django testing

我想测试提交后是否将消息发送给用户。我正在使用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期间被调用,而不是。{/ p>

我已经仔细检查过TEMPLATE_CONTEXT_PROCESSORSMIDDLEWARE_CLASSESINSTALLED_APPS - 可能明天我会发现我错过了一些东西。


重要细节

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


解决方案

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

2 个答案:

答案 0 :(得分:3)

在单元测试期间,可以在

中找到该消息
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)

答案 1 :(得分:2)

我找到的最好的方法是使用mock

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.')
BTW:还应该有一种通过使用mock获取请求的方法。并通过使用来自django.contrib.messages.get_messages

的请求对象获取消息