Python: Как смоделировать функцию высшего порядка в понимании списка - PullRequest
0 голосов
/ 08 мая 2019

Чтобы научиться издеваться, я пытаюсь настроить юнит-тесты для скрипта, который у меня есть.Я застрял на функции, содержащей 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, но, видимо, это не так. Я мог бы неправильно понять, как вы должны писать модульные тесты для такого рода функций. Любая помощь очень ценится.

...