簡體   English   中英

Moto 不模擬 DynamoDB

[英]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 每個版本都有其他問題。

  • 我們已經使用它很多年了,每次更新 boto3 時都必須解決棘手的錯誤,有時整個測試套件都會崩潰數周。 生活在升級的恐懼中是不可能的。
  • 當使用更高級的功能時,您通常會收到神秘的錯誤消息,最終導致您得出不支持所討論功能的結論。

出於這樣的依賴關系將整個測試套件重寫為 go 是一件痛苦的事情,而且當然總是在錯誤的時間出現,墨菲定律。

自己模擬 AWS 依賴項進行單元測試,並依靠集成測試來確認整個 thinkg 是否正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM