如何在python中断言dict包含另一个没有assertDictContainsSubset的字典?

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)

限制: 字典值必须是可清除的.

  • 请注意,这是否有效取决于词典的内容:如果有某些东西不可用,如列表,用作值,则无法创建"set". (8认同)
  • 问题是关于“assertDictContainsSubset”,它是一个单元测试便利函数,因此适用于单元测试的解决方案是合适的 (2认同)

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.

它适用于不可清洗的物品,但您无法准确知道哪个物品最终会失败.


Sam*_*way 7

接受的答案的一个大问题是,如果对象值中有不可散列值,则它不起作用.第二件事是你没有得到有用的输出 - 测试通过或失败,但不告诉你对象中的哪个字段是不同的.

因此,简单地创建子集字典然后测试它更容易.这样你就可以使用这个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)


Ris*_*nha 6

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)


Bed*_*ang 5

您可以使用assertGreaterEqualassertLessEqual

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(),否则不会起作用。

  • 当它们不匹配时更好的错误消息 (2认同)