我试图为一个与DynamoDB通信的Lambda函数编写单元测试。我正在使用moto,但它并不是在嘲弄任何东西。每当我在boto3中调用什么东西时,它就会使用我的AWS配置文件与实际的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帐户中创建表。
我在这里错过了什么?谢谢
发布于 2020-06-07 02:04:02
我发现问题出在from visitorCounterLambda import handler部件上,因为该脚本在导入时已经建立了一个boto3客户机,因此mock无法破坏它。Moto文件在“非常重要--推荐的用法”下面列出了正确的方法。首先应该建立@mock_dynamodb2,然后再将外部资源放到函数中。
示例:
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)发布于 2022-11-16 17:05:35
依我看,离摩托远点。每一个版本都伴随着其他问题。
重写整个测试套件以摆脱这种依赖是一种痛苦,当然总是在错误的时间到来,墨菲定律。
模拟AWS依赖项以进行单元测试,并依靠集成测试来确认整个thinkg是否正常工作。
https://stackoverflow.com/questions/62232709
复制相似问题