pyhamcrest содержит совпадения для списка диктов
Почему pyhamcrest терпит неудачу: содержит () совпадение для списка из 2 или более диктов, но отлично работает со списком из 1 диктов?
Каков наилучший способ написать 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 хочет двух совпадений. Второй дикт не подходит.