pyhamcrest包含用于列表的匹配器

时间:2017-10-13 18:48:56

标签: python dictionary python-unittest pyhamcrest

为什么pyhamcrest失败包含() matcher以获取2个或更多dicts的列表,但是对于1个dict的列表可以正常工作?

PyHamcrest contains

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

第一次测试通过,第二次测试失败了。

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

1 个答案:

答案 0 :(得分:1)

您正在寻找has_item,而不是contains

有些令人困惑的是,PyHamcrest的contains不是__contains__魔术方法意义上的遏制检查。它的语义模仿原始的Hamcrest contains matcher。它不测试列表中的某些元素是否与给定的匹配器匹配;它需要为每个列表元素分别使用匹配器,它会将匹配器应用于列表的相应元素。 has_item是检查某个项目是否匹配的那个。

引用docs

  

匹配,如果序列的元素满足给定的匹配器列表, in   为了

     

参数:match1,... - 以逗号分隔的匹配器列表   此匹配器迭代评估的序列和给定的匹配器列表,   看看每个元素是否满足相应的匹配器。

     

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

您已为两个元素列表提供了一个匹配器。 PyHamcrest需要两个匹配器。第二个字典没有得到匹配。