如何使用Jest在Nodejs中模拟AmazonDynamoDBv3



我使用的是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)

最新更新