如何使用 `side_effect` 修补对象的属性

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 的 class 初始化,因此我使用 @patch("some_class.SomeReader")。但我也想模拟 SomeReaderread_path 函数,因此我有 mock_some_reader.read_path.side_effect = mock_read_path 但这似乎不起作用。

您正在做的是模拟 class 本身,而不是 classes 的实例。模拟替换调用以实例化 SomeReader(url)(基本上替换 class 的 __init__ 方法)。

然后你想做的是模拟 SomeReader(url)

创建的假实例的 return 值
@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("")