장고 메시지 단위 테스트는 어떻게하나요?
내 django 애플리케이션에서 작업을 수행 한 다음 응답에서 메시지를 확인하는 단위 테스트를 작성하려고합니다.
내가 말할 수있는 한, 이것을하는 좋은 방법은 없습니다.
CookieStorage 저장 방법을 사용하고 있으며 다음과 유사한 작업을 수행하고 싶습니다.
response = self.client.post('/do-something/', follow=True)
self.assertEquals(response.context['messages'][0], "fail.")
문제는 내가 돌려받는 건
print response.context['messages']
<django.contrib.messages.storage.cookie.CookieStorage object at 0x3c55250>
이것을 유용한 것으로 바꾸려면 어떻게해야합니까, 아니면 모두 잘못하고 있습니까?
고마워, 다니엘
정말 쉬운 접근 방식을 찾았습니다.
response = self.client.post('/foo/')
messages = list(response.context['messages'])
self.assertEqual(len(messages), 1)
self.assertEqual(str(messages[0]), 'my message')
컨텍스트가없는 응답에서 메시지를 확인해야하는 경우 다음을 사용할 수 있습니다.
from django.contrib.messages import get_messages
messages = list(get_messages(response.wsgi_request))
self.assertEqual(len(messages), 1)
self.assertEqual(str(messages[0]), 'my message')
대체 저장소는 인덱싱을 지원하지 않지만 반복 가능합니다.
이것은 나를 위해 작동합니다 (모든 메시지 표시).
print [m.message for m in list(response.context['messages'])]
또한 Django의 TestCase에서 상속 된 테스트 클래스에있는 몇 가지 유틸리티 메서드가 있습니다. 함수로 사용하려면 self인수를 제거하고 self.fail()의를 raise.
def assert_message_count(self, response, expect_num):
"""
Asserts that exactly the given number of messages have been sent.
"""
actual_num = len(response.context['messages'])
if actual_num != expect_num:
self.fail('Message count was %d, expected %d' %
(actual_num, expect_num))
def assert_message_contains(self, response, text, level=None):
"""
Asserts that there is exactly one message containing the given text.
"""
messages = response.context['messages']
matches = [m for m in messages if text in m.message]
if len(matches) == 1:
msg = matches[0]
if level is not None and msg.level != level:
self.fail('There was one matching message but with different'
'level: %s != %s' % (msg.level, level))
return
elif len(matches) == 0:
messages_str = ", ".join('"%s"' % m for m in messages)
self.fail('No message contained text "%s", messages were: %s' %
(text, messages_str))
else:
self.fail('Multiple messages contained text "%s": %s' %
(text, ", ".join(('"%s"' % m) for m in matches)))
def assert_message_not_contains(self, response, text):
""" Assert that no message contains the given text. """
messages = response.context['messages']
matches = [m for m in messages if text in m.message]
if len(matches) > 0:
self.fail('Message(s) contained text "%s": %s' %
(text, ", ".join(('"%s"' % m) for m in matches)))
에서 장고 문서 :
템플릿 외부에서 get_messages ()를 사용할 수 있습니다.
따라서 다음과 같이 작성할 수 있습니다.
from django.contrib.messages import get_messages
[...]
messages = [m.message for m in get_messages(response.wsgi_request)]
self.assertIn('My message', messages)
최신 정보
내 원래 대답은 django가 여전히 1.1 정도일 때 작성되었습니다. 이 답변은 더 이상 관련이 없습니다. 더 나은 솔루션은 @daveoncode의 답변 을 참조하십시오 .
원래 답변
나는 이것을 테스트하기 위해 실험을했다. MESSAGE_STORAGE내 프로젝트 중 하나의 설정을로 변경하고 'django.contrib.messages.storage.cookie.CookieStorage'메시지를 확인하기 위해 작성한 테스트를 실행했습니다. 효과가있었습니다.
The key difference from what you were doing is the way I retrieved messages. See below:
def test_message_sending(self):
data = dict(...)
response = self.client.post(reverse('my_view'), data)
messages = self.user.get_and_delete_messages()
self.assertTrue(messages)
self.assertEqual('Hey there!', messages[0])
This may be worth a try.
Simpler version of the stalemate one:
class TestCaseMessagesMixture(object):
def assertMessageCount(self, response, expect_num):
"""
Asserts that exactly the given number of messages have been sent.
"""
actual_num = len(response.context['messages'])
if actual_num != expect_num:
self.fail('Message count was %d, expected %d' %
(actual_num, expect_num)
)
def assertMessageEqual(self, response, text):
"""
Asserts that the response includes the message text.
"""
messages = [m.message for m in response.context['messages']]
if text not in messages:
self.fail(
'No message with text "%s", messages were: %s' %
(text, messages)
)
def assertMessageNotEqual(self, response, text):
"""
Asserts that the response does not include the message text.
"""
messages = [m.message for m in response.context['messages']]
if text in messages:
self.fail(
'Message with text "%s" found, messages were: %s' %
(text, messages)
)
참고URL : https://stackoverflow.com/questions/2897609/how-can-i-unit-test-django-messages
'Nice programing' 카테고리의 다른 글
| ggplot2 플롯 영역 여백? (0) | 2020.11.08 |
|---|---|
| "abstract : true"상태에 URL을 지정하는 이유는 무엇입니까? (0) | 2020.11.08 |
| emacs가 수정 된 파일에 대한 임시 심볼릭 링크를 만드는 이유는 무엇입니까? (0) | 2020.11.08 |
| cron없이 AWS에서 예약 된 작업 실행 (0) | 2020.11.08 |
| typescript의 module.exports (0) | 2020.11.08 |