在Python中模拟一个模拟对象的方法?

问题描述 投票:5回答:1

我正在使用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)) ,但这两个都没有。

如何模拟返回对象的函数,然后模拟该对象的方法以使其返回列表?

python python-3.x unit-testing mocking
1个回答
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

我希望这能解决问题!

© www.soinside.com 2019 - 2024. All rights reserved.