首页 > 解决方案 > 如何验证 Python 方法是否使用包括 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())

Whereself.get_test_data_frame()是一个预定义的 DataFrame,它是调用的预期结果。

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

在此处输入图像描述

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

文件“C:\python3.6\lib\unittest\mock.py”,第 812 行,在 assert_call_with 中如果预期!= 实际:文件“C:\python3.6\lib\unittest\mock.py”,第 2055 行,在eq 返回 (other_args, other_kwargs) == (self_args, self_kwargs) 文件“C:\python3.6\lib\site-packages\pandas\core\generic.py”,第 1330 行,在非零 f“的真值a {type(self) .name } is ambiguous." ValueError: DataFrame 的真值是不明确的使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

通过阅读其他问题,我认为这是因为 MagicMock 尝试调用 == 但 Pandas 需要 .equals() 来检查是否相等。有谁知道另一种方法?

标签: pythonpandasdataframeassertmagicmock

解决方案


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

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

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

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

call_list = ClassToMock.method_to_mock.call_args_list

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


推荐阅读