-1

我有一个 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'

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

4

1 回答 1

0

问题在于字节文字前缀 b

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

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

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

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

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

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

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

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

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

于 2017-08-23T23:55:37.717 回答