【发布时间】: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