[英]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.