如何在单元测试中断言变量内容(Flask,Python3,Nose2)

时间:2017-08-20 04:53:39

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

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

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

1 个答案:

答案 0 :(得分:0)

问题在于bytes literal prefix b

  

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

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

解决方案是将b前缀更改为bytes function bytes,其中声明:

  

也可以使用文字创建字节对象,请参阅字符串和字节文字。

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

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

以下是我原帖的示例的工作语法:

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

感谢John Gordon建议在评论中切换到bytes,但从未正式回答。所以过了几天,我现在就开始关闭它。