【问题标题】:How to assert variable content in unit test (Flask, Python3, Nose2)如何在单元测试中断言变量内容(Flask、Python3、Nose2)
【发布时间】:2017-08-20 04:53:39
【问题描述】:

我有一个 Flask 应用程序,其中一些页面内容来自全局变量。我正在尝试设置一些单元测试来断言数据,但我似乎无法让局部变量工作:

TEST_STRING = foo

self.assertIn(b['TEST_STRING'], response.data)

失败:

NameError: name 'b' is not defined

如果我引用普通变量:

self.assertIn(TEST_STRING, response.data)

我得到了预期的失败:

TypeError: a bytes-like object is required, not 'str'

如果我将变量数据硬编码到测试中,则测试成功,但如果变量发生更改,我宁愿不必更新测试。我在这里错过了什么?

【问题讨论】:

  • 我在这里遗漏了什么?首先,您错过了向我们展示定义 b 的代码的部分。
  • @JohnGordon b 就在我的第一个代码块中,即左括号后的第一个字符。它没有在其他地方定义,因为它是 string literal。我认为您的反对票是错误的。
  • 这就是 b 被引用的地方,但你从来没有告诉我们 b 是在哪里定义,即b = <something> 和/或global b。 (而且我没有投反对票;我只是发表了评论。)
  • 我假设您打算将 b 作为字典名称。但现在我想您可能希望b 表示字节字符串表示法,如b'hello'。我认为符号只适用于字符串文字;对于变量,请改用bytes(TEST_STRING)
  • @JohnGordon 感谢您的回复,我很抱歉假设这是您的反对意见并且没有更清楚。我对此很陌生。是的,b 用于表示字节前缀,但我想它是简写,在某些情况下并不完全等于 bytes。按照您的建议进行切换,谢谢!我还必须指定我的编码类型以避免 TypeError。这是从全局配置中提取的行:self.assertIn(bytes(app.config['TEST_STRING'], "utf-8"), response.data)。再次感谢。

标签: python python-3.x unit-testing flask nose2


【解决方案1】:

问题出在bytes literal prefix b:

字节文字总是以'b'或'B'为前缀;它们生成 bytes 类型而不是 str 类型的实例。它们可能只包含 ASCII 字符;数值为 128 或更大的字节必须用转义符表示。

虽然听起来像 bytesprefix = bytes 类型,但如果数据来自变量,这似乎不起作用。

解决方案是将b 前缀更改为bytes functionbytes,其中指出:

Bytes 对象也可以用字面量创建,请参阅 String 和 Bytes 字面量。

虽然它们看起来可以互换,但情况并非总是如此!

对于我的用例,我还必须为 bytes 函数指定我的编码类型。

这是我原始帖子示例的工作语法:

self.assertIn(bytes(TEST_STRING, "utf-8"), response.data)

感谢John Gordon,他建议在 cmets 中切换到bytes,但从未正式回答。所以几天后,我会继续关闭它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多