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

2024-02-06

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

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 = MagicMock()
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))

但这两者都不起作用。

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


你想要的就是拥有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

我希望这能解决问题!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中模拟模拟对象的方法? 的相关文章