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

标签 python python-3.x unit-testing mocking

我正在为用 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 = 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)) 但是这两个都不起作用。

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

最佳答案

您想要的是让 get_all_versions 返回一个对象,该对象具有返回 version_list 的方法 order_by:

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

我希望这能解决问题!

关于python - 在 Python 中模拟模拟对象的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47451429/

相关文章:

node.js - 如何使用 jasmine-node 对非模块进行单元测试? (与关闭 Electron 中的 Node 集成有关)

python - 在 Pandas 中执行连接

python - Databricks 中的 PySpark 将表转换为 pandas 时出错

python - Range() 包括其正向和负向步长的界限

python - 将列表转换为仅基于元组某些值的副本的集合

php - phpunit 测试的执行顺序是什么?

python - 如何在 Python 和 web3.py 中获取 Solidity revert/require 错误原因

python - 不考虑子包中的文件

python - 在 Huggingface BERT 模型之上添加密集层

rest - SoapUI - 带有查询参数的 REST Mocking