- 此问题在此处已有答案**:
Python unittest's assertDictContainsSubset recommended alternative [duplicate](4个答案)
1年前关闭。
我知道assertDictContainsSubset
在python 2.7中可以做到这一点,但由于某些原因,它在python 3.2中被弃用了。那么,有没有办法Assert一个dict包含另一个没有assertDictContainsSubset
的dict呢?
这似乎不太好:
for item in dic2:
self.assertIn(item, dic)
还有别的好办法吗?谢谢
8条答案
按热度按时间krcsximq1#
虽然我使用的是pytest,但我在一条评论中发现了下面的想法,它对我来说非常有用,所以我认为它在这里可能会很有用。
巨蟒3:
巨蟒2:
它适用于不可散列的项,但您无法确切地知道哪个项最终会失败。
zf9nrax12#
反过来说:
hc2pp10m3#
可接受答案的一个大问题是,如果对象值中有不可散列的值,它就不起作用;第二个问题是,你得不到有用的输出--测试通过或失败,但没有告诉你对象中的哪个字段不同。
因此,简单地创建一个子集字典,然后测试它会更容易。这样,您可以使用
TestCase.assertDictEquals()
方法,它将在您的测试运行程序中提供非常有用的格式化输出,显示实际与预期之间的差异。我认为最令人愉快和深奥的方法是用一个简单的字典来理解:
注意,如果您正在一个属于继承自TestCase的子类的方法中运行测试(您几乎肯定应该这样做),那么它就是
self.assertDictEqual(subset, expected)
yizd12fk4#
John1024的解决方案对我很有效,但是,如果失败了,它只会告诉你
False
,而不会告诉你哪些键不匹配,所以,我尝试使用其他Assert方法来避免使用已弃用的assert方法,这些方法会输出有用的失败消息:m528fe3b5#
您可以使用
assertGreaterEqual
或assertLessEqual
。请务必指定
.items()
,否则它将不起作用。9nvpjoqh6#
在Python 3和Python 2.7中,你可以创建一个dict的类似于集合的“项视图”,而不需要复制任何数据,这允许你使用比较操作符来测试子集关系。
在Python 3中,这看起来像:
在Python 2.7中,你可以使用
viewitems()
方法代替items()
来获得相同的结果。在Python 2.6及以下版本中,最好的办法是迭代第一个dict中的键,并检查第二个dict中的包含。
esbemjvw7#
这回答了一个比你要问的更广泛的问题,但是我在我的测试工具中使用它来检查
container
字典是否包含看起来像contained
字典的东西。它检查键和值。另外,你可以使用关键字'ANYTHING'
来表明你不关心它如何匹配。bvpmtnay8#
下面是一个比较,即使你的字典中有列表也可以: