2017-08-20 17 views
-1

我有一个Flask应用程序,其中一些页面内容来自全局变量。我试图建立一些单元测试断言数据,但我似乎无法得到,甚至一个局部变量的工作:如何在单元测试(Flask,Python3,Nose2)中声明变量内容

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' 

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

+0

_我在这里错过了什么?_对于初学者,您错过了向您显示定义'b'的代码的部分。 –

+0

@JohnGordon在我的第一个代码块中,'b'就在那里,这是开头括号后面的第一个字符。它没有在别处定义,因为它是[字符串文字](https://docs.python.org/3.3/reference/lexical_analysis.html#string-and-bytes-literals)。我相信你的倒票是错误的。 – mrrg

+0

这就是其中b是_referenced_的地方,但是你从来没有向我们展示过b是_defined_,即'b = '和/或'全局b'。 (我没有downvote;我只是评论。) –

回答

0

的问题是与bytes literal prefixb

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

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

解决的办法是改变b前缀bytes functionbytes,其中规定:

字节对象也可以用文字创造,看到字符串和字节文字。

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

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

这里是工作语法我原来的职位的例子:

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

由于去John Gordon谁建议在评论中切换到bytes,但从来没有正式回答。所以几天之后,我会继续,现在就关闭它。

相关问题