Python 2& 3兼容的unicode字符串断言等式

时间:2016-11-04 16:12:40

标签: python unit-testing unicode

我有一些代码可以返回repr的例外情况。它需要在Python 2和Python 3上运行。

代码的一个非常愚蠢的版本如下:

from __future__ import unicode_literals

class Foo:
    def bar(self):
        return repr(Exception('bar'))

问题在于测试上面的代码。

Python 3.5:

foo = Foo()
assert foo.bar() == "Exception('bar',)"
# true

Python 2.7:

foo = Foo()
assert foo.bar() == "Exception('bar',)"
# false because foo.bar() returns "Exception(u'bar',)",
# note the ``u`` before the first ``'``

在断言两个字符串相等时,是否有一种优雅的方法可以忽略u?我正在使用unittest2。

1 个答案:

答案 0 :(得分:1)

没有简单的方法来改变"字符串相等。有一些方法可以进行近似匹配,但这可能会允许您不想要的其他更改。

解决问题的最佳方法是简单地更改assert条件的定义方式。以下替代方案应该适用于python2& python3:

  • 创建动态期望的异常:

    assert foo.bar() == repr(Exception(u'bar'))
    
  • 使用in并检查两种选择:

    assert foo.bar() in ("Exception('bar',)", "Exception(u'bar',)")
    

后者允许u'bar'甚至在python2中,根据您的要求,它可能没有问题。