我正在嘗試使用 moto 在 python 代碼中模擬 acm 客戶端,但它似乎不起作用。來自依賴注入的心態,這個模擬裝飾器的想法對我來說并不清楚。
def handle_custom_resource_request(event, context):
try:
cert_arn = event['PhysicalResourceId']
acm_client.delete_certificate(CertificateArn=cert_arn)
except Exception as e:
pass
finally:
pass
@mock_acm
def test_handle_custom_resource_request():
event = {
'RequestType': 'Delete',
'PhysicalResourceId': 'arn:aws:acm:eu-west-1:123456789:certificate/DummyCertificate',
'ResponseURL': 'http://localhost'
}
context = {}
response = cert_requester.handle_custom_resource_request(event, context)
print(response)
我想模擬這個 acm 客戶端,它應該回傳一個 True 值,例如在delete_certificate呼叫該方法時。但是,在此測驗中似乎沒有發生任何模擬,并且我收到以下錯誤
botocore.exceptions.ClientError:呼叫DeleteCertificate操作時發生錯誤(ExpiredTokenException):請求中包含的安全令牌已過期
有沒有辦法像我們在其他語言測驗框架中那樣模擬回傳值。
uj5u.com熱心網友回復:
為了避免您的測驗到達 AWS,必須在創建任何 boto3-clients 之前啟動模擬。
從您的示例代碼中,最簡單的方法是簡單地移動匯入:
@mock_acm
def test_handle_custom_resource_request():
import cert_requester
event = {
'RequestType': 'Delete',
'PhysicalResourceId': 'arn:aws:acm:eu-west-1:123456789:certificate/DummyCertificate',
'ResponseURL': 'http://localhost'
}
context = {}
response = cert_requester.handle_custom_resource_request(event, context)
print(response)
該檔案對此有更多資訊: http ://docs.getmoto.org/en/latest/docs/getting_started.html#what-about-those-pesky-imports
我想模擬這個 acm 客戶端,例如當呼叫 delete_certificate 方法時,它應該回傳一個 True 值。
將 Moto 視為 AWS 的本地離線等價物。當你有一個通過 AWS 的單元測驗時,使用 boto3-requests 來驗證它是否做了它應該做的事情,你可以mock_..在它上面加上 -decorator。使用上面的裝飾器,您可以相信測驗仍會驗證行為是否正確,但無需針對 AWS 運行它。
例如,如果你想知道一個證書是否被成功洗掉,你可以使用下面的 boto3-requests:
- 呼叫
describe_certificate,并驗證它會引發錯誤(因為它不再存在) - 打電話
list_certificates,確認被洗掉的證書不再出現
所以最終的測驗可能看起來像這樣:
def test_handle_custom_resource_request():
# GIVEN
# A certificate exists
# WHEN
# Our business logic should delete the certificate with that ARN
import cert_requester
event = {
'RequestType': 'Delete',
'PhysicalResourceId': 'arn:aws:acm:eu-west-1:123456789:certificate/DummyCertificate',
'ResponseURL': 'http://localhost'
}
context = {}
response = cert_requester.handle_custom_resource_request(event, context)
print(response)
# THEN
# the certificate should be deleted
certificates = boto3.client("acm").list_certificates()
assert "DummyCertificate" not in certificates
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442512.html
