6

在发布到我的烧瓶应用程序的 url 的不同输入值上,它会闪烁不同的消息,例如“未输入数据”、“无效输入”、“未找到记录”、“找到 3 条记录”。

有人可以指导我如何编写鼻子测试来检查是否显示了正确的闪存消息?我猜闪存消息首先进入会话......我们如何在鼻子测试中检查会话变量?

谢谢

4

3 回答 3

6

使用 session['_flashes'] 测试闪烁的方法对我不起作用,因为在我的情况下,会话对象根本没有 '_flashes' 属性:

with client.session_transaction() as session:
    flash_message = dict(session['_flashes']).get('warning')

KeyError: '_flashes'

这可能是因为我在 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)))

在我的情况下,闪存消息是“无效的用户名或密码”。

我认为它也更容易阅读。希望对遇到类似问题的朋友有所帮助

于 2018-02-18T19:12:37.267 回答
4

这是一个断言存在预期闪存消息的示例测试。它基于此处描述的方法:

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.')]
于 2016-03-25T15:47:57.500 回答
0

@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 和其他显示闪烁消息的方法。

这使得精确检查闪烁的内容变得容易。

于 2022-01-20T23:31:09.537 回答