我有一個使用 AWS 服務(例如 dynamodb)的 Flask 應用程式。我想在單元測驗期間模擬這些,但我在這樣做時遇到了麻煩。
這是一個對我不起作用的最小示例:
from flask import Flask
import boto3
app = Flask(__name__)
@app.route("/")
def hello():
aws_session = boto3.session.Session()
dynamodb = aws_session.resource("dynamodb")
table = dynamodb.Table("test-table")
table.put_item(Item={
"hello": "world"
})
return "ok"
from moto import mock_dynamodb
import pytest
@pytest.fixture
def client():
with app.test_client() as client:
yield client
@mock_dynamodb
def test_response(client):
rv = client.get('/')
assert rv.data == "ok"
我收到資源不存在的錯誤。這意味著實際上正在進行 AWS 呼叫。為什么沒有模擬呼叫?
uj5u.com熱心網友回復:
Moto 更像是一個模擬器而不是傳統的模擬。它模擬了快樂的路徑,但如果輸入有任何問題,它也會拋出與 AWS 相同的錯誤。
AWS 會在此處拋出該表不存在的錯誤 - 所以 Moto 也會這樣做。(而且,與 AWS 一樣,Moto 實際上需要該表存在才能將專案“保留”在其中。)
先創建表的時候mock請求成功:
@app.route("/")
def hello():
aws_session = boto3.session.Session()
conn = aws_session.client("dynamodb")
conn.create_table(
TableName="test-table",
KeySchema=[{"AttributeName": "hello", "KeyType": "HASH"}],
AttributeDefinitions=[{"AttributeName": "hello", "AttributeType": "S"}],
ProvisionedThroughput={"ReadCapacityUnits": 5, "WriteCapacityUnits": 5},
)
dynamodb = aws_session.resource("dynamodb")
table = dynamodb.Table("test-table")
table.put_item(Item={
"hello": "world"
})
return "ok"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485050.html
