我在多个测试中模拟 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()
,但我尝试过的任何事情都无法让我更接近我想要的(即两个测试都通过,并且在运行时没有抛出任何异常)。