有没有办法在unittest中比较嵌套数据结构但忽略具体类型的对象,例如assertSequenceEqual但是递归,例如:
#!/usr/bin/env python
import unittest
class DeepCompareTestCase(unittest.TestCase):
def test_compare(self):
# this test fails
self.assertSequenceEqual(
[['abc', 'def']],
(('abc', 'def'),)
)
unittest.main()
(像Perl中的Test :: Deep)
最佳答案 会这样的吗?
import unittest
from itertools import zip_longest
class RecursiveTestCase(unittest.TestCase):
def assertSequenceDeepEqual(self, x, y):
MissingValue = MissingValueSentinel()
for x, y, in zip_longest(x, y, fillvalue=MissingValue):
try:
self.assertSequenceDeepEqual(self, x, y)
except TypeError:
self.assertEqual(x, y)
self.assertIsNot(x, MissingValue)
self.assertIsNot(y, MissingValue)
class MissingValueSentinel(object):
pass
如果一个或多个项不是迭代器,zip_longest会引发TypeError,表明您位于递归的底部.
如果其中一个迭代器比另一个迭代器短,我让它返回一个自定义的MissingValueSentinel对象,该对象由函数末尾的assertIsNot调用检测到.这样做的唯一原因是,如果x或y有一个类,无论出于何种原因,它都比较等于偶数ad-hoc类,如MissingValueSentinel,但是assertEqual在该类的两个不同对象之间仍然有意义.这似乎是一个非常奇怪的边缘情况,你可以安全地忽略它.
使用zip_longest而不是zip可防止[1,2,3]错误地匹配[1,2].