Проверка флеш-сообщений в тестах носа приложения фляги
На разных входных значениях, отправленных на URL моего приложения-колбы, он мигает разными сообщениями, например, "данные не введены", "неверный ввод", "запись не найдена", "3 записи найдены".
Может кто-нибудь подсказать, как мне написать тест на нос, чтобы проверить, отображается ли правильное флеш-сообщение? Я предполагаю, что флэш-сообщения сначала идут в сеанс... как мы можем проверить переменные сеанса в тестах на нос?
Спасибо
3 ответа
Метод тестирования мигает с сеансом ['_ вспышки'] у меня не сработал, потому что у объекта сеанса просто нет атрибута _flashes в моем случае:
with client.session_transaction() as session:
flash_message = dict(session['_flashes']).get('warning')
KeyError: '_flashes
'
Это может быть из-за того, что самая последняя версия flask и других пакетов, которые я использую с Python 3.6.4, могут работать по-другому, я, честно говоря, не знаю...
То, что сработало для меня, является простым и понятным:
def test_flash(self):
# attempt login with wrong credentials
response = self.client.post('/authenticate/', data={
'email': 'bla@gmail.com',
'password': '1234'
}, follow_redirects=True)
self.assertTrue(re.search('Invalid username or password',
response.get_data(as_text=True)))
В моем случае флеш-сообщение было "Неверное имя пользователя или пароль".
Я думаю, что это также легче читать. Надеюсь, это поможет тем, кто столкнулся с подобной проблемой
Вот пример теста, который подтверждает наличие ожидаемого флэш-сообщения. Он основан на методе, описанном здесь:
def test_should_flash_warning_message_when_no_record_found(self):
# Arrange
client = app.test_client()
# Assume
url = '/records/'
expected_flash_message = 'no record found'
# Act
response = client.get(url)
with client.session_transaction() as session:
flash_message = dict(session['_flashes']).get('warning')
# Assert
self.assertEqual(response.status_code, 200, response.data)
self.assertIsNotNone(flash_message, session['_flashes'])
self.assertEqual(flash_message, expected_flash_message)
Замечания: session['_flashes']
будет список кортежей. Что-то вроде этого:
[(u'warning', u'no records'), (u'foo', u'Another flash message.')]
Ответ @klenwell у меня не сработал, и я хотел чего-то более надежного, чем то, что сделал @leo.
Я создал служебную функцию для извлечения мигающих сообщений из ответа.
Все мои шаблоны имеют загрузочную модальную форму для показа мигающих сообщений:
{% with messages = get_flashed_messages() %}
{% if messages %}
<div id="flash-dlg" class="modal fade" tabindex="-1" role="dialog">
...
<div class="modal-body">
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
</div>
...
</div>
{% endif %}
{% endwith %}
Моя служебная функция получает ответ и возвращает список высветившихся сообщений:
def get_flash(rsp):
h = lxml.html.fromstring(rsp.data)
pars = h.xpath('.//div[@id="flash-dlg"]//div[@class="modal-body"]/p')
texts = [p.text for p in pars]
return texts
Я использую lxml, но его можно легко адаптировать к BeautifulSoup и другим методам представления мигающих сообщений.
Это позволяет легко точно проверить, что было прошито.