Jer*_*Cai 38 python python-2.7 python-3.x python-unittest
我知道assertDictContainsSubset
可以在python 2.7中做到这一点,但由于某种原因它在python 3.2中已被弃用.那么有没有办法断言一个dict包含另一个没有assertDictContainsSubset
?
这看起来不太好:
for item in dic2:
self.assertIn(item, dic)
Run Code Online (Sandbox Code Playgroud)
还有其他好方法吗?谢谢
Joh*_*024 26
>>> d1 = dict(a=1, b=2, c=3, d=4)
>>> d2 = dict(a=1, b=2)
>>> set(d2.items()).issubset( set(d1.items()) )
True
Run Code Online (Sandbox Code Playgroud)
反过来说:
>>> set(d1.items()).issubset( set(d2.items()) )
False
Run Code Online (Sandbox Code Playgroud)
限制: 字典值必须是可清除的.
kep*_*ler 16
虽然我正在使用pytest,但我在评论中发现了以下想法.它对我来说真的很棒,所以我觉得它在这里很有用:
assert dict1.items() <= dict2.items()
Run Code Online (Sandbox Code Playgroud)
对于Python 3和
assert dict1.viewitems() <= dict2.viewitems()
Run Code Online (Sandbox Code Playgroud)
对于Python 2.
它适用于不可清洗的物品,但您无法准确知道哪个物品最终会失败.
接受的答案的一个大问题是,如果对象值中有不可散列值,则它不起作用.第二件事是你没有得到有用的输出 - 测试通过或失败,但不告诉你对象中的哪个字段是不同的.
因此,简单地创建子集字典然后测试它更容易.这样你就可以使用这个TestCase.assertDictEquals()
方法,它会在你的测试运行器中为你提供非常有用的格式化输出,显示实际和预期之间的差异.
我认为最令人愉快和pythonic的方法是使用简单的字典理解:
from unittest import TestCase
actual = {}
expected = {}
subset = {k:v for k, v in actual.items() if k in expected}
TestCase().assertDictEqual(subset, expected)
Run Code Online (Sandbox Code Playgroud)
显然,如果你在一个属于继承自TestCase的子类的方法中运行你的测试(你几乎肯定应该这样)那么它就是 self.assertDictEqual(subset, expected)
John1024的解决方案对我有用.但是,如果发生故障,它只会告诉您,False
而不是向您显示哪些键不匹配.所以,我试图通过使用其他断言方法来避免使用已弃用的断言方法,这些方法将输出有用的失败消息:
expected = {}
response_keys = set(response.data.keys())
for key in input_dict.keys():
self.assertIn(key, response_keys)
expected[key] = response.data[key]
self.assertDictEqual(input_dict, expected)
Run Code Online (Sandbox Code Playgroud)
您可以使用assertGreaterEqual
或assertLessEqual
。
users = {'id': 28027, 'email': 'chungs.lama@gmail.com', 'created_at': '2005-02-13'}
data = {"email": "chungs.lama@gmail.com"}
self.assertGreaterEqual(user.items(), data.items())
self.assertLessEqual(data.items(), user.items()) # Reversed alternative
Run Code Online (Sandbox Code Playgroud)
一定要指定.items()
,否则不会起作用。
归档时间: |
|
查看次数: |
18749 次 |
最近记录: |