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

在Python中模拟模拟对象的方法?,python,python-3.x,unit-testing,mocking,Python,Python 3.x,Unit Testing,Mocking,我正在使用unittest.mock库为一个用Python 3.4编写的项目编写单元测试。我正在测试的函数包含对函数的调用 versions=获取所有版本(一些参数) 我用一个返回列表的MagicMock对象对其进行了修补,这样version就变成了一个版本号列表,所有这些都可以正常工作 现在,我正在测试的代码发生了一些变化,看起来 versions=get\u all\u versions(一些参数)。order\u by(另一个参数) 现在我需要使用order\u by方法返回相同的版本

我正在使用
unittest.mock
库为一个用Python 3.4编写的项目编写单元测试。我正在测试的函数包含对函数的调用

versions=获取所有版本(一些参数)

我用一个返回列表的
MagicMock
对象对其进行了修补,这样
version
就变成了一个版本号列表,所有这些都可以正常工作

现在,我正在测试的代码发生了一些变化,看起来

versions=get\u all\u versions(一些参数)。order\u by(另一个参数)

现在我需要使用
order\u by
方法返回相同的版本号列表,而
get\u所有版本都应该保持模拟状态,我在实现这一点时遇到了一些问题

我已经试过用胶水修补它了

get_all_versions=MagickMock()
获取所有版本。订购方式=版本列表

但这是行不通的,我想这是因为,
order\u by
是一种方法,而不是一种属性。我也试过了

get_all_versions=MagicMock()
获取所有版本。订购者=MagicMock(返回值=版本列表)

和(更绝望地)

get_all_versions=MagicMock(return_value=MagicMock(return_value=version_list))
但这两个都不起作用


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

您想要的是让
get\u all\u versions
返回一个对象,该对象具有一个返回
version\u list
的方法
order\u by

get_all_versions = MagicMock()
get_all_versions.return_value.order_by.return_value = version_list
get_all_versions = MagicMock()
get_all_versions.order_by = version_list
get_all_versions = MagicMock(return_value=MagicMock(return_value=version_list))

为了解释您的尝试失败的原因,您的第一次尝试将方法
order\u替换为
version\u list

get_all_versions = MagicMock()
get_all_versions.return_value.order_by.return_value = version_list
get_all_versions = MagicMock()
get_all_versions.order_by = version_list
get_all_versions = MagicMock(return_value=MagicMock(return_value=version_list))
其结果大致如下:

get_all_versions.order_by == version_list

第二次尝试将
get\u all\u versions
的返回值替换为类似于函数的值,并返回
version\u list

get_all_versions = MagicMock()
get_all_versions.return_value.order_by.return_value = version_list
get_all_versions = MagicMock()
get_all_versions.order_by = version_list
get_all_versions = MagicMock(return_value=MagicMock(return_value=version_list))
这导致:

get_all_versions(some_argument)(another_argument) == version_list

我希望这能把事情弄清楚

哇,这是一件很难自己解决的事情,谢谢你