如何模拟 DynamoDB 客户端,同时隔离其他模拟的函数/对象?

问题描述 投票:0回答:0

我在多个测试中模拟 SDK 客户端 (DynamoDB) 时遇到问题。

我在以下代码沙箱中创建了一个最低限度可重现的示例:CodeSandbox

附加了两个测试,每个测试本质上都会调用一个 Lambda,该 Lambda 依赖于一组常量(

TEST_1
TEST_2
)和 DynamoDB 客户端。两个测试的区别在于模拟的常量的值不同。

当我单独运行这两个测试时,它们都单独通过了。但是,当我在同一次执行中按顺序运行测试时(通常是测试 1,然后是测试 2),则第二个测试会因对象相等断言而失败:

Expected: "newtest1"
Received: "test1"

      53 |
      54 |     expect(dynamoDbMock).toHaveReceivedCommand(QueryCommand);
    > 55 |     expect(result.TEST_1).toBe("newtest1");

Jest 似乎保留了测试 1 中的模拟常量值,并且没有在测试 2 中覆盖它们。这是我面临的主要问题。

作为参考,我正在使用 AWS SDK v3,并且我正在使用 AWS 博客中推荐的模拟库


此时,我尝试了几种方法来解决此问题:本质上,我希望在每个测试中“从头开始”模拟两个依赖模块(常量和 SDK 客户端)。让我走得最远的是将每个测试主体包裹在

jest.isolateModules()
功能块中。

但是,我没有将其包含在可重现的示例中,因为这实际上看起来比以前更有问题的状态:虽然两个测试似乎“通过”,但在执行后控制台会打印抛出的奇怪验证异常,并且当我调试每个测试时,我看到它们实际上在

dynamoDbClient.send()
调用中失败了——我认为这里没有使用 DynamoDB 客户端模拟,它实际上使用的是真实的客户端实例。但不知何故,Jest 仍然将测试标记为已通过。见下图:

我做错了什么?我怀疑我在某个地方需要一个

jest.resetModules()
,但我尝试过的任何事情都无法让我更接近我想要的(即两个测试都通过,并且在运行时没有抛出任何异常)。

node.js unit-testing jestjs mocking aws-sdk
© www.soinside.com 2019 - 2024. All rights reserved.