如何使用python更改Assertion错误的输出?

时间:2013-04-21 04:34:36

标签: python

在Mac OS X的终端上。

assertEqual的输出是

  File "tests/test_conditions.py", line 27, in test_if_condition
    self.assertEqual(result, expected)
AssertionError: '    if (self) {\n        self.addMainLabel\n        self.addSubLabel\n        self.setupBackground\n    }\n' != '    if self\n        self.addMainLabel\n        self.addSubLabel\n        self.setupBackground\n    end\n'

但我想通过评估换行符'\ n'得到以下输出,并在'AssertionError:'之后添加换行符。

  File "tests/test_conditions.py", line 27, in test_if_condition
    self.assertEqual(result, expected)
AssertionError: 
'    if (self) {
        self.addMainLabel
        self.addSubLabel
        self.setupBackground
    }
' != 
'    if self
        self.addMainLabel
        self.addSubLabel
        self.setupBackground
    end
'

2 个答案:

答案 0 :(得分:1)

我认为你至少不能轻易做到。

转义的换行符来自assertEqual在两个字符串中的每一个上调用repr。没有它,你也不会得到引号。如果你的任何一个字符串包含!=,那就会非常混乱。

如果你确实想要捏造断言的文本,你可以捕捉它,操纵它的属性然后重新加载它。我不推荐这个,但有可能:

try:
    self.assertEquals(result, expected)
except AssertionError as e:
    e.args = (e.args[0].replace("\\n", "\n"),) # edit the exception's message
    raise

这并没有给出你想要的输出(在字符串的开头没有添加额外的换行符),但它非常接近。

答案 1 :(得分:1)

使用换行符获取类似输出的最简单方法是直接为每个assertMultiLineEqual相等比较调用str或将其注册为类型特定的方法assertEqual。你可以在你的设置中使用它来完成后者,

self.addTypeEqualityFunc(str, 'assertMultiLineEqual')

然后当你在两个字符串上调用assertEqual时,你会得到类似的东西,

Traceback (most recent call last):
  File "tests.py", line 10, in test1
    self.assertEqual(result, expected)
AssertionError: '    if (self) {\n        self.addMainLabel\n        self.addSubLabel\n        s [truncated]... != '    if self\n        self.addMainLabel\n        self.addSubLabel\n        self. [truncated]...
-     if (self) {
?        -    ---
+     if self
          self.addMainLabel
          self.addSubLabel
          self.setupBackground
-     }
+     end

unittest使用difflib,以便输出突出显示两个字符串不同的地方,您可能会或可能不会找到这些地方。