【发布时间】:2017-11-22 06:27:45
【问题描述】:
我正在为我的一个 python 2.7 方法编写一个单元测试用例。
在我的测试方法中,有一个方法调用将带有字符串键和 panadas 数据框的字典作为该键的值。
我想为此方法编写一个交互测试,以检查它是否使用正确的字典在内部调用该方法
def MethodUnderTest(self):
#some code here
externalMethod(dictionary_of_string_dataframe)
#some code here
在单元测试中,我确实编写了我的断言来测试这样的交互
mock_externalClass.externalMethod.assert_called_once_with(dictionary_of_string_dataframe)
我创建 dictionary_of_string_dataframe 的方式与在实际方法中创建的方式完全相同。事实上,我复制了在测试代码中执行此操作的辅助方法,只是为了确保两个字典相同。我什至在 python 控制台上调试测试方法时打印了这两个字典,它们看起来完全一样。
我使用 @patch 装饰器修补外部类,一切正常。
问题是在上面提到的断言语句中,我得到以下错误:
mock_externalClass.externalMethod.assert_called_once_with(dictionary_of_string_dataframe)
File "C:\Python27\lib\site-packages\mock\mock.py", line 948, in assert_called_once_with
return self.assert_called_with(*args, **kwargs)
File "C:\Python27\lib\site-packages\mock\mock.py", line 935, in assert_called_with
if expected != actual:
File "C:\Python27\lib\site-packages\mock\mock.py", line 2200, in __ne__
return not self.__eq__(other)
File "C:\Python27\lib\site-packages\mock\mock.py", line 2196, in __eq__
return (other_args, other_kwargs) == (self_args, self_kwargs)
File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 953, in __nonzero__
.format(self.__class__.__name__))
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我确实搜索了 valueError 但没有太多帮助。 谁能告诉我这里发生了什么?
我确实检查了以下问题,但没有帮助
【问题讨论】:
-
所以澄清一下:您有两个将字符串映射到 pandas 数据帧的字典,并且您想检查它们是否相等。您正在自己编写单元测试,即使使用相同的函数和参数创建的两个字典,您也会收到上述错误。
-
当我运行测试用例时,它会在被测方法内部使用字符串:数据帧的字典来命中外部方法。在测试用例本身中,我使用问题中给出的语句测试此交互,并使用与被测方法中使用的相同帮助方法在 mock_externalClass.externalMethod.assert_call_once_with 的测试方法中创建 dict 值。但是,我得到一个错误。
-
恕我直言,您采取了错误的方法。您基本上是在尝试强制您的代码通过测试,而不是让测试强制执行所需的结果。如果更改了外部方法的签名,您的测试将不会检测到代码破坏性更改,但是只有当您修复代码时,您的测试才会失败。我建议您将派生输入并调用外部方法的代码解耦到它自己的方法中并单独测试该方法,分离您的关注点。
标签: python pandas python-unittest python-unittest.mock