簡體   English   中英

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

您正在做的是模擬 class 本身,而不是類的實例。 模擬替換調用以實例化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("")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM