Проверка флеш-сообщений в тестах носа приложения фляги

На разных входных значениях, отправленных на 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 и другим методам представления мигающих сообщений.

Это позволяет легко точно проверить, что было прошито.

Другие вопросы по тегам