Чтобы научиться издеваться, я пытаюсь настроить юнит-тесты для скрипта, который у меня есть.Я застрял на функции, содержащей map()
и partial()
, и я не могу понять, как имитировать вывод этих данных.
Я настроил насмешки для итераций в некоторых других моих функциях, иэкспериментировали с __iter__
методами, как описано здесь: Как позволить MagicMock вести себя как диктовщик? , а также читать документацию по макетам, но я не могу заставить ее работать для этой функции.Функция работает корректно при тестировании с реальными данными.
Предполагается, что сама функция получает атрибуты, указанные в attr_list
, путем поиска элементов, возвращаемых find_elements()
, и возвращает их в качестве кадра данных.Я использую map()
, чтобы применить список атрибутов к функции ElementTree get()
, и partial()
, чтобы всегда использовать default=0
(https://docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.get).
. Я только хочу проверить эту часть, поэтому я исправляю обаfind_elements
и create_dataframe
.
Функция:
def get_attributes(xml, tag, attr_list):
attr_list.insert(0, 't') # time (always wanted and hence not specified in attr_list)
elements = find_elements(xml, tag)
values = [map(partial(element.get, default=0), attr_list) for element in elements]
return create_dataframe(values, attr_list)
И тест:
@patch('reports.create_dataframe')
@patch('reports.find_elements')
def test_attribute_values_are_added_to_df(self, mocked_find, mocked_create):
data = [10, 1, 2]
attr_list = ['t', 'attr1', 'attr2']
element = MagicMock()
mocked_find.return_value = [element]
element.get.return_value = data
reports.get_attributes('xmlfile', 'tag', ['attr1', 'attr2'])
mocked_create.assert_called_once_with([10, 1, 2], columns=attr_list)
Когда я запускаю этот тест, я получаю:
AssertionError: Expected call: create_dataframe([10, 1, 2], ['t', 'attr1', 'attr2'])
Actual call: create_dataframe([<map object at 0x7f5417c07048>], ['t', 'attr1', 'attr2'])
Что я думаю, я делаю, чтобы объект mocked_find
возвращал список из одного MagicMock
-объекта, который при повторном выполнении возвращает указанный data
список, который затем может быть передан в create_dataframe
, но, видимо, это не так. Я мог бы неправильно понять, как вы должны писать модульные тесты для такого рода функций. Любая помощь очень ценится.