我正在使用unittest.mock
库为Python 3.4编写的项目编写单元测试。我正在测试的函数包含对函数的调用
versions = get_all_versions(some_argument)
我使用返回列表的MagicMock
对象进行修补,以便version
成为版本号列表,一切正常。
现在,我正在测试的代码发生了一些变化,看起来像是
versions = get_all_versions(some_argument).order_by(another_argument)
现在我需要order_by
方法返回相同的版本号列表,而get_all_versions
应该保持嘲笑,我在实现这个方面遇到了一些问题。
我尝试用
修补它 get_all_versions = MagickMock()
get_all_versions.order_by = version_list
但这不起作用,我想这是因为order_by
是一个方法,而不是一个属性。我也试过
get_all_versions = MagicMock()
get_all_versions.order_by = MagicMock(return_value=version_list)
和(更加拼命)
get_all_versions = MagicMock(return_value=MagicMock(return_value=version_list))
但这两者都不起作用。
如何模拟返回对象的函数,然后模拟该对象的方法以使其返回列表?
答案 0 :(得分:6)
你想要的是让get_all_versions
返回一个方法order_by
返回version_list
的对象:
get_all_versions = MagicMock()
get_all_versions.return_value.order_by.return_value = version_list
要解释为什么您的尝试无效,首次尝试将order_by
替换为值version_list
:
get_all_versions = MagicMock()
get_all_versions.order_by = version_list
结果大致如下:
get_all_versions.order_by == version_list
第二次尝试将get_all_versions
的返回值替换为看似函数的返回值并返回version_list
:
get_all_versions = MagicMock(return_value=MagicMock(return_value=version_list))
这导致:
get_all_versions(some_argument)(another_argument) == version_list
我希望这能解决问题!