如何使用 `side_effect` 修补对象的属性
python 205
原文标题 :How to patch an object’s attributes with `side_effect`
所以我有一个文件some_class.py
,里面有:
class SomeReader:
def read_path(self, url):
return "read_path"
class SomeClass:
def __init__(self, url):
self.reader = SomeReader(url)
print(self.reader.read_path(""))
还有一个测试文件some_class_test.py
:
from some_class import SomeClass, SomeReader
@patch("some_class.SomeReader")
def test_some_class(mock_some_reader):
def mock_read_path(url):
return "mock_read_path"
mock_some_reader.read_path.side_effect = mock_read_path
SomeClass("")
我期待当我运行这个测试时,它会打印mock_read_path
但它会打印<MagicMock name='SomeReader().read_path()' id='140701381288480'>
。我该如何解决?我想模拟SomeReader
的类初始化,因此我使用@patch("some_class.SomeReader")
。但我也想模拟SomeReader
的read_path
函数,因此我有mock_some_reader.read_path.side_effect = mock_read_path
但这似乎不起作用。
回复
我来回复-
flakes 评论
您正在做的是模拟类本身,而不是类的实例。 mock 替换了对实例化
SomeReader(url)
的调用(基本上替换了类的__init__
方法)。然后,您要做的是模拟由
SomeReader(url)
创建的假实例的返回值@patch("some_class.SomeReader") def test_some_class(mock_some_reader): def mock_read_path(url): return "mock_read_path" mock_some_reader.return_value.read_path.side_effect = mock_read_path SomeClass("")
2年前