我使用的是aws-sdk v3中的AmazonDynamoDB包,用于javascript
以下是我遵循的文档:https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/dynamodb-examples.html
我已经安装了"@aws-sdk/client generanddb";包从代码中执行CRUD操作。
我以这种方式从包中导入了命令:
import { DynamoDBClient, PutItemCommand, DeleteItemCommand, UpdateItemCommand, GetItemCommand } from "@aws-sdk/client-dynamodb";
const dynamodbClient = new DynamoDBClient({ region: process.env.DYNAMODB_REGION, endpoint: process.env.DYNAMODB_ENDPOINT });
const result = await dynamodbClient.send(new PutItemCommand(params));
我试着模仿亚马逊迪纳摩数据库的Jest文档,但它在本地调用了真正的亚马逊迪纳摩。
如何嘲笑这些"@aws-sdk/client generanddb";Nodejs中的包
请在Nodejs中提供一个示例!
这个答案可能来得有点晚:(目前有两个非常有用的包来处理aws dynamodb模拟
- @shelf/jest-dynolderdb
- jest-dynalite-在没有java和
@aws-sdk/client-dynamodb
的情况下工作
在我的情况下,我最终使用了第二个选项jest-dynalite
,因为它不需要java,而且很容易配置:(
您可以将AWSMock与sinon一起使用,并根据需要模拟方法和响应。它非常适合开玩笑,而且它不调用真正的数据库。
您应该安装aws-dynadb jar,并在dynadb客户端中使用端点。
你可以设置一个docker容器来运行dynamodb:
$ docker run -d -p 8000:8000 instructure/dynamo-local-admin:latest
当你为测试设置dynamodb客户端时,继续使用端点:
import { DynamoDBClient, PutItemCommand, DeleteItemCommand, UpdateItemCommand, GetItemCommand } from "@aws-sdk/client-dynamodb";
const dynamodbClient = new DynamoDBClient({ region: process.env.DYNAMODB_REGION, endpoint: process.env.DYNAMODB_ENDPOINT });
const result = await dynamodbClient.send(new PutItemCommand(params));
运行测试后,您可以在localhost:8000
上的管理UI上检查结果。
AWS建议使用AWS-sdk客户端mock和模块中包含的文档来模拟DynamoDB和AWS的其余部分。
安装aws-sdk-client mock,可能还有aws-sdk client mock-jest
npm i aws-sdk-client-mock aws-sdk-client-mock-jest
导入模块
import {mockClient} from "aws-sdk-client-mock";
import 'aws-sdk-client-mock-jest';
创建一个模拟。每次测试后重置
describe('Winner purge service', () => {
const ddbMock = mockClient(DynamoDBClient)
beforeEach(() => {
jest.clearAllMocks()
ddbMock.reset()
})
定义响应
ddbMock
.on(ScanCommand).resolvesOnce({
Items: [marshall(configItem, {removeUndefinedValues: true})],
Count: 1
})
ddbMock.on(QueryCommand)
.resolvesOnce({
Items: [marshall(olderWinner)], Count: 1
})
.resolves({
Items: [], Count: 0
})
测试调用
expect(ddbMock.commandCalls(DeleteItemCommand).length).toBe(0)