如何模拟对象方法返回值

Cod*_*bee 5 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()
Run Code Online (Sandbox Code Playgroud)

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

hoe*_*ing 6

patch('some_package.some_other_method')some_other_method用一个Mock. 现在你需要替换some_obj_some_method这个mock的方法的返回值:

mock.return_value.some_obj_some_method.return_value = False
Run Code Online (Sandbox Code Playgroud)

完整示例:

# 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()
Run Code Online (Sandbox Code Playgroud)

测试:

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()
Run Code Online (Sandbox Code Playgroud)

测试将按原样通过,将在RuntimeError不打补丁的情况下引发 a并在没有该行的情况下使断言失败,function_mock.return_value.some_obj_some_method.return_value = False因为some_method只会返回一个Mocknever False