繁体   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