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 に配置しましたがclient.post、そうではありません。

を再確認しましたがTEMPLATE_CONTEXT_PROCESSORS、おそらく明日、何かを見逃していることに気付くでしょう。MIDDLEWARE_CLASSESINSTALLED_APPS


重要な詳細

送信が成功した場合、ビューはHttpResponseRedirectを返すためresponse.context、空であることを忘れていました。


解決

View はリダイレクト (コンテキスト データを持たない) を返し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.')

ところで: モックを使用してリクエストを取得する方法もあるはずです。そして、リクエストオブジェクトを使用して、django.contrib.messages.get_messages からメッセージを取得します

于 2013-01-10T10:44:34.640 に答える