如何验证 Python 方法是使用包含数据帧的参数调用的?

How can I verify a Python method was called with parameters including a DataFrames?

我正在使用 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() 是预定义的 DataFrame,它是调用的预期结果。

当我打印出传递给模拟方法的 DataFrame 和测试 DataFrame 时,我可以看到它们在打印时看起来相等:

但测试输出认为它们不相等:

File "C:\python3.6\lib\unittest\mock.py", line 812, in assert_called_with if expected != actual: File "C:\python3.6\lib\unittest\mock.py", line 2055, in eq return (other_args, other_kwargs) == (self_args, self_kwargs) File "C:\python3.6\lib\site-packages\pandas\core\generic.py", line 1330, in nonzero f"The truth value of a {type(self).name} is ambiguous. " ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

从阅读其他问题来看,我认为这是因为 MagicMock 试图调用 == 但 Pandas 需要 .equals() 来检查是否相等。有人知道替代方法吗?

所以我做了更多的挖掘,发现 call_args 它捕获了所有传递的参数。

对我更有用的是 call_args_list,因为我的方法可以多次调用。

call_args_list 提供了所有以元组形式进行的调用。

在我的示例中,我使用以下内容捕获了 call_args_list

call_list = ClassToMock.method_to_mock.call_args_list

然后我解压元组以获取 DataFrame 并能够使用 .equals() 方法检查相等性。