Как я могу проверить, что метод Python был вызван с параметрами, включающими фреймы данных?

#python #pandas #dataframe #assert #magicmock

#python #pandas #фрейм данных #утверждать #magicmock

Вопрос:

Я использую MagicMock для проверки того, что метод был вызван с определенными аргументами:

 ClassToMock.method_to_mock = MagicMock(name='method_to_mock')
ClassToMock.method_that_creates_data_frame_and_passes_to_mocking_method()
ClassToMock.method_to_mock.assert_called_with('test_parameter_value', self.get_test_data_frame())
  

Где self.get_test_data_frame() находится предварительно определенный фрейм данных, который является ожидаемым результатом вызова.

Когда я распечатываю фрейм данных, переданный методу mocking, и тестовый фрейм данных, я вижу, что при печати они выглядят одинаково:

введите описание изображения здесь

но вывод теста не считает, что они равны:

Файл «C:python3.6libunittestmock.py «, строка 812, в assert_called_with, если ожидается != фактический: Файл «C:python3.6libunittestmock.py «, строка 2055, в eq возвращает (other_args, other_kwargs) == (self_args, self_kwargs) файл «C:python3.6libsite-packagespandascoregeneric.py «, строка 1330, в ненулевом f»Истинностное значение a {type(self).name} неоднозначно. » Ошибка значения: значение истинности фрейма данных неоднозначно. Используйте .empty , .bool() ,.item(),.any() или.all() .

Читая другие проблемы, я думаю, это связано с тем, что MagicMock пытается вызвать ==, но Pandas требуют .equals() для проверки равенства. Кто-нибудь знает об альтернативном подходе?

Ответ №1:

Итак, я еще немного покопался и наткнулся на call_args, который фиксирует все переданные параметры.

Еще более полезным для меня был call_args_list, поскольку мой метод можно вызывать несколько раз.

call_args_list Предоставляет список всех вызовов, которые были выполнены в виде кортежей.

В моем примере я записал call_args_list следующее:

 call_list = ClassToMock.method_to_mock.call_args_list
  

Затем я распаковал кортежи, чтобы получить фрейм данных, и смог проверить равенство с помощью метода .equals() .