python - 如何模拟对象方法返回值

标签 python unit-testing mocking pytest python-mock

我目前拥有的是:

def some_method():
    some_obj = some_other_method()
    # This is what I want to mock return value of:
    some_obj.some_obj_some_method()

@patch('some_package.some_other_method')
def test_some_stuff(some_other_method_patch):
    some_other_method_patch.return_value = SomeObject()

我怎样才能将 some_obj.some_obj_some_method() 的返回值设置为 False?

最佳答案

patch('some_package.some_other_method') 会将函数 some_other_method 替换为 Mock。现在您需要替换此模拟的方法 some_obj_some_method 的返回值:

mock.return_value.some_obj_some_method.return_value = False

完整示例:

# some_package.py

class SomeObject:
    def some_obj_some_method(self):
        raise RuntimeError()


def some_other_method():
    return SomeObject()


def some_method():
    some_obj = some_other_method()
    # This is what you want to mock return value of:
    return some_obj.some_obj_some_method()

测试:

from unittest.mock import patch
from some_package import SomeObject, some_method

@patch('some_package.some_other_method')
def test_some_stuff(function_mock):
    function_mock.return_value.some_obj_some_method.return_value = False
    assert not some_method()

测试将按原样通过,将在没有修补的情况下引发 RuntimeError 并且在没有行 function_mock.return_value.some_obj_some_method.return_value = False 的情况下断言失败,因为 some_method 只会返回一个 Mock,它永远不会是 False

关于python - 如何模拟对象方法返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56772331/

相关文章:

python - 如何让vim自动在开头写入固定注释?

python - 将多个迁移压缩为一个

python - 我可以扩展 Logger 类而不更改记录的模块名称/函数名称/行号吗?

c# - 使用 Flurl GetResponseJson<TError>() 进行单元测试代码

python - 如何在 try-except 语句中正确处理 pyodbc 错误

java - EasyMock 作废方法

unit-testing - 在Go lang中一个接一个地多次模拟具有不同响应的相同功能

python - 使用 Python 根据上次修改更新文件

c++ - 模拟类可以从 googlemock 中的另一个模拟类继承吗?

java - 使用 Mockito 测试 Mono 和 Flux