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

Syn*_*xén 6 python unit-testing mocking python-3.x

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

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

Ken*_*das 8

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

get_all_versions = MagicMock()
get_all_versions.return_value.order_by.return_value = version_list
Run Code Online (Sandbox Code Playgroud)

要解释为什么你的企图没有工作,你的第一次尝试替换方法order_by与价值version_list

get_all_versions = MagicMock()
get_all_versions.order_by = version_list
Run Code Online (Sandbox Code Playgroud)

结果大致如下:

get_all_versions.order_by == version_list
Run Code Online (Sandbox Code Playgroud)

第二次尝试用get_all_versions看起来像函数的东西替换了返回值,并返回version_list

get_all_versions = MagicMock(return_value=MagicMock(return_value=version_list))
Run Code Online (Sandbox Code Playgroud)

结果是:

get_all_versions(some_argument)(another_argument) == version_list
Run Code Online (Sandbox Code Playgroud)

我希望这可以清除一切!

  • 哇,这是一个很难自己弄清楚的事情,谢谢 (3认同)