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))
但是这两个都不起作用。
如何模拟返回对象的函数,然后模拟该对象的方法以使其返回列表?
您想要的是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)
我希望这可以清除一切!