pyhamcrest包含dicts列表的匹配器



为什么pyhamcrest在2个或多个dict列表的contains()匹配器中失败,但在1个dict的列表中却能正常工作?

PyHamcrest包含

为dicts列表编写hamcrest(pyhamcrest)匹配器的最佳方式是什么?

在这个单元测试示例中,第一个测试通过,第二个测试失败。

import unittest
from hamcrest import contains, assert_that, has_entries
class ContainsTest(unittest.TestCase):
dict1, dict2 = {"a": 1, "b": 2}, {"a": 1, "b": 2}
sequence1, sequence2 = list(), list()
sequence1.append(dict1)
sequence2.append(dict1)
sequence2.append(dict2)
@staticmethod
def test_sequence():
assert_that(ContainsTest.sequence1, contains(has_entries({'a': 1, 'b': 2})))
assert_that(ContainsTest.sequence2, contains(has_entries({'a': 1, 'b': 2})))

if __name__ == "__main__":  
ContainsTest.test_sequence()

单元测试输出:

File "/usr/local/lib/python3.6/site-packages/hamcrest/core/assert_that.py", 
line 57, in _assert_match raise AssertionError(description) 
AssertionError:  
Expected: a sequence containing [a dictionary containing {'a': <1>, 'b': <2>}]
but: Not matched: <{'a': 1, 'b': 2}>
Ran 1 test in 0.027s
FAILED (failures=1)
Process finished with exit code 1

您要找的是has_item,而不是contains

令人困惑的是,PyHamcrest的contains并不是__contains__魔术方法意义上的包含性检查。它的语义是以最初的Hamcrest的contains匹配器为模型的。它不是在测试列表中的某个元素是否与给定的匹配器匹配;它希望每个列表元素都有一个单独的匹配器,并将匹配器应用于列表的相应元素。has_item是检查某个项目是否匹配的一个。

引用文档:

如果序列的元素满足给定的匹配器列表,则匹配订单。

参数:match1,…–匹配器的逗号分隔列表
该匹配器迭代评估的序列和给定的匹配器列表,查看每个元素是否满足其对应的匹配器。

任何不是匹配器的参数都隐式包装在equal_to匹配器,以检查是否相等。

您为两个元素的列表提供了一个匹配器。PyHamcrest想要两个匹配者。第二条格言不匹配。

最新更新