如何使用Jest在Nodejs中模拟Amazon DynamoDB v3?

tvz2xvvm  于 2023-05-28  发布在  Node.js
关注(0)|答案(4)|浏览(246)

我正在使用aws-sdk v3中的Amazon DynamoDB包用于javascript。
以下是我遵循的文档:https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/dynamodb-examples.html
我已经安装了“@aws-sdk/client-dynamodb”包来从代码执行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));

我曾试图模仿Amazon DynamoDB跟随Jest文档,但它在本地调用真实的的Amazon DynamoDB。
如何在Nodejs中模拟这些“@aws-sdk/client-dynamodb”包?
请在Nodejs中提供一个示例!

zdwk9cvp

zdwk9cvp1#

这个答案可能来得有点晚:)目前有两个非常有用的包来处理aws dynamodb模拟

  • @shelf/jest-dynamodb
  • jest-dynalite-不使用java和@aws-sdk/client-dynamodb

在我的例子中,我最终使用了第二个选项,jest-dynalite,因为它不需要java,而且很容易配置:)

eh57zj3b

eh57zj3b2#

您可以将AWSMock与sinon一起使用,并根据需要模拟方法和响应。它可以很好地处理jest,而且它不调用真正的数据库。

afdcj2ne

afdcj2ne3#

您应该安装aws dynamodb jar并在dynamodb客户端中使用一个端点。
你可以设置一个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上检查结果。

ekqde3dh

ekqde3dh4#

AWS recommends使用aws-sdk-client-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)

相关问题