pyhamcrest содержит совпадения для списка диктов

Почему pyhamcrest терпит неудачу: содержит () совпадение для списка из 2 или более диктов, но отлично работает со списком из 1 диктов?

PyHamcrest содержит

Каков наилучший способ написать Hamcrest (Pyhamcrest) Matcher для списка диктов?

Первый тест пройден, второй не пройден в этом примере.

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()

Unittest выход:

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 ответ

Решение

Ты ищешь has_item не contains,

Несколько запутанно, PyHamcrest's contains не проверка сдерживания в смысле __contains__ магический метод. Его семантика смоделирована после оригинального Hamcrest's contains совпадение Он не проверяет, соответствует ли какой-либо элемент списка указанному сопоставителю; он хочет отдельное сопоставление для каждого элемента списка и применяет сопоставления к соответствующим элементам списка. has_item это тот, который проверяет, соответствует ли какой-либо элемент.

Цитирование документов:

Соответствует, если элементы последовательности удовлетворяют заданному списку сопоставлений, по порядку.

Параметры: match1,... - Разделенный запятыми список соответствий.
Этот сопоставитель выполняет итерацию оцененной последовательности и заданного списка сопоставлений, проверяя, удовлетворяет ли каждый элемент соответствующему сопоставителю.

Любой аргумент, который не является сопоставителем, неявно включается в сопоставление equal_to для проверки на равенство.

Вы предоставили одно сопоставление для списка из двух элементов. PyHamcrest хочет двух совпадений. Второй дикт не подходит.

Другие вопросы по тегам