[英]Moto doesn't mock DynamoDB
我正在嘗試為與 DynamoDB 通信的 Lambda function 編寫單元測試。 我正在使用moto
,但它不是 mocking 任何東西。 每當我在 boto3 中調用某些東西時,它都會使用我的 AWS CLI 配置文件與實際的 API 進行通信,而不是模擬的。 為什么會這樣?
這是代碼:
### Unit test for the visitorCounterLambda function
from visitorCounterLambda import handler
import boto3
from moto import mock_dynamodb2
def setUp(self):
#pass
self.region = 'us-east-2'
@mock_dynamodb2
def test_handler():
dynamodb = boto3.client('dynamodb')
ddbTableName = "myDDBtable"
# table = dynamodb.create_table(
# TableName = ddbTableName,
# BillingMode='PAY_PER_REQUEST',
# AttributeDefinitions=[
# {
# 'AttributeName': 'id',
# 'AttributeType': 'S'
# },
# ],
# KeySchema=[
# {
# 'AttributeName': 'id',
# 'KeyType': 'HASH'
# },
# ]
# )
tablesListed = dynamodb.list_tables()
print(tablesListed)
if __name__ == '__main__':
test_handler()
print(tablesListed)
從我的實際帳戶返回我的實際表格。 如果我取消注釋create_table
命令,它也會在我的 AWS 賬戶中創建該表。
我在這里錯過了什么? 謝謝
我發現問題出在from visitorCounterLambda import handler
部分,因為該腳本在導入時已經建立了一個 boto3 客戶端,因此mock
無法破壞它。 正確的做法在Moto 文檔中的“非常重要 - 推薦用法”下進行了概述。 您應該首先建立@mock_dynamodb2
,然后import
您的外部資源導入 function。
例子:
import boto3
from moto import mock_dynamodb2
@mock_dynamodb2
def test_handler():
from visitorCounterLambda import handler
dynamodb = boto3.client('dynamodb')
## do your magic here
tablesListed = dynamodb.list_tables()
print(tablesListed)
以我的愚見:遠離 moto 。 每個版本都有其他問題。
出於這樣的依賴關系將整個測試套件重寫為 go 是一件痛苦的事情,而且當然總是在錯誤的時間出現,墨菲定律。
自己模擬 AWS 依賴項進行單元測試,並依靠集成測試來確認整個 thinkg 是否正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.