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

xiaoxingxing 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")。但我也想模拟SomeReaderread_path函数,因此我有mock_some_reader.read_path.side_effect = mock_read_path但这似乎不起作用。

原文链接:https://stackoverflow.com//questions/71521962/how-to-patch-an-objects-attributes-with-side-effect

回复

我来回复
  • flakes的头像
    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年前 0条评论