修补已用类的属性

问题描述 投票:0回答:1

我正在尝试修补类中的两个属性,但模拟返回的是 MagicMock 而不是预期的返回值(字符串)。

客户端类:

class ClientApi:
    def create_path(self):
        return f"client_api_{self.time_now}T{self.date_now}.json"

    @property
    def date_now(self):
        return datetime.now().strftime("%Y-%m-%d")

    @property
    def time_now(self):
        return datetime.now().strftime("%H:%M:%S")    

测试班

class TestClientApi:

    @pytest.fixture
    def setup_class(self):
        yield ClientApi()

    def test_create_path(self, setup_class):
        with patch("client_api.ClientApi.date_now") as mock_date_now, \
                patch(client_api.ClientApi.time_now") as mock_time_now:

            mock_date_now.return_value = "2023-11-28"
            mock_time_now.return_value = "00:00:00"
            expected_path = "client_api_2023-11-28T00:00:00.json"
            assert expected_path = setup_class.create_path()

create_path 方法正在返回

"<MagicMock name='time_now' id='1687227445600'>T<MagicMock name='date_now' id='1687227461936'>.json"
,我想了解原因。

我也想问是否有人知道如何将两个补丁压缩为一个以及它是否有效,例如:

def test_create_path(self, setup_class):
    with patch("client_api.ClientApi") as mock_client_api:

        mock_client_api.return_value.date_now.return_value = "2023-11-28"
        mock_client_api.return_value.time_now.return_value = "00:00:00"

或任何类似的方式,但它不是嘲笑它,只是发送当前时间戳。

提前谢谢您

python python-3.x python-unittest python-unittest.mock
1个回答
0
投票

当您将实例方法设置为属性时,它会成为描述符实例并且不再是可调用的,因此您无法使用模拟对象修补描述符实例,并且仍然期望它表现得像描述符并自动为您调用其底层 getter 函数.

由于属性的行为类似于实例属性,因此您可以使用

patch.multiple
来将这两个属性替换为您想要的模拟值:

with patch.multiple(ClientApi, date_now="2023-11-28", time_now="00:00:00"):
    expected_path = "client_api_2023-11-28T00:00:00.json"
    assert expected_path = setup_class.create_path()
© www.soinside.com 2019 - 2024. All rights reserved.