重构嵌套"带补丁"语句的最佳方法



我正在尝试修补代码中的Azure Digital Twin API。目前,我已经通过嵌套with patch语句实现了一种可行但可能不是最Python的方法。

重写它的最佳方法是什么,这样我就可以在多个测试函数中使用它,并在需要时更改返回值?

def test_create_digital_twin(self):

with patch("endpoints.digital_twin.ClientSecretCredential"):
with patch("azure_digital_twin.create_digital_twin.DigitalTwinsClient.query_twins",) as mock_query:
with patch("azure_digital_twin.create_digital_twin.DigitalTwinsClient.upsert_digital_twin") as mock_upsert_twin:
with patch("azure_digital_twin.create_digital_twin.DigitalTwinsClient.upsert_relationship") as mock_upsert_relationship:

mock_query.return_value = [] 
mock_upsert_twin.return_value = {
"$dtId":"spc-1", 
"$etag":"random", 
"$model":"dtmi:digitaltwins:rec_3_3:core:Asset;1"
}
mock_upsert_relationship.return_value = {
"$relationshipId":"spc-1-hasPart-spc-2", 
"$sourceId":"spc-1",
"$targetId" : "spc-2",
"$relationshipName":"hasPart"
}
response = self.client.post(
endpoint,
params={"node" : "spc-1"},
)

assert response.status_code == status.HTTP_201_CREATED

您可以使用contextlib模块中的ExitStack

from contextlib import ExitStack

def test_create_digital_twin(self):
with ExitStack() as es:
def make_azure_patch(x):
return es.enter_context(patch(f'azure_digital_twin.create_digital_twin.DigitalTwinsClient.{x}'))
es.enter_context("endpoints.digital_twin.ClientSecretCredential"))
mock_query = make_patch("query_twins")
mock_upsert_twin = make_patch("upsert_digital_twin")
mock_upsert_relationship = make_patch("upsert_relationship")

mock_query.return_value = [] 
mock_upsert_twin.return_value = {
"$dtId":"spc-1", 
"$etag":"random", 
"$model":"dtmi:digitaltwins:rec_3_3:core:Asset;1"
}
mock_upsert_relationship.return_value = {
"$relationshipId":"spc-1-hasPart-spc-2", 
"$sourceId":"spc-1",
"$targetId" : "spc-2",
"$relationshipName":"hasPart"
}
response = self.client.post(
endpoint,
params={"node" : "spc-1"},
)
assert response.status_code == status.HTTP_201_CREATED

make_azure_patch只是一个辅助函数,用于减少创建三个单独补丁的线的长度。

相关内容

  • 没有找到相关文章

最新更新