我正在尝试修补类中的两个属性,但模拟返回的是 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"
或任何类似的方式,但它不是嘲笑它,只是发送当前时间戳。
提前谢谢您
当您将实例方法设置为属性时,它会成为描述符实例并且不再是可调用的,因此您无法使用模拟对象修补描述符实例,并且仍然期望它表现得像描述符并自动为您调用其底层 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()