【问题标题】:Mock a method of a mocked object in Python?在 Python 中模拟一个模拟对象的方法?
【发布时间】:2017-11-23 09:06:29
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    你想要的是让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
    

    我希望这可以解决问题!

    【讨论】:

    • 哇,这个很难自己搞清楚,谢谢
    • 没错!! @sleepyhead
    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多