如何模拟对象方法 return 值
How to mock objects methods return value
我目前拥有的是:
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() return 值设置为 False?
您可以使用patch.object
import mock
import some_obj
@mock.patch.object(some_obj, "some_obj_some_method")
def test_some_stuff(mock_some_obj_some_method):
mock_some_obj_some_method.return_value = False
patch('some_package.some_other_method')
会将函数 some_other_method
替换为 Mock
。现在您需要替换此模拟的方法 some_obj_some_method
的 return 值:
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
只会 return a Mock
永远不会是 False
.
我目前拥有的是:
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() return 值设置为 False?
您可以使用patch.object
import mock
import some_obj
@mock.patch.object(some_obj, "some_obj_some_method")
def test_some_stuff(mock_some_obj_some_method):
mock_some_obj_some_method.return_value = False
patch('some_package.some_other_method')
会将函数 some_other_method
替换为 Mock
。现在您需要替换此模拟的方法 some_obj_some_method
的 return 值:
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
只会 return a Mock
永远不会是 False
.