5

我想测试提交后是否将消息发送给用户。我正在使用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)

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


@Tisho回答后更新

应该在 中找到消息response.context,甚至我的胆量都说它应该可以工作,但事实并非如此。我已经放在import pdb; pdb.set_trace()django/contrib/messages/context_processors.py 中,看看它是否在 test 期间被调用client.post,它不是。

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


重要细节

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


解决方案

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

4

2 回答 2

6

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

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)
于 2012-07-12T17:12:58.080 回答
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.')

BTW: There are also should be a way to get request by using mock. And by using request object get message from django.contrib.messages.get_messages

于 2013-01-10T10:44:34.640 回答