如何在Dynamoose中Mock指定updatedAt值的Item满足E2E测试?
解决Dynamoose覆盖自定义Mock updatedAt字段的问题
Dynamoose默认的timestamps配置会自动更新createdAt和updatedAt字段,这就是你的Mock数据被覆盖的原因。下面是几种可行的解决方式:
临时禁用模型的自动时间戳
在保存Mock数据时,通过配置选项关闭自动时间戳功能,这样自定义的updatedAt值就会被保留:// 假设你的模型为ItemModel,mockItem是你创建的带自定义updatedAt的对象 await ItemModel.save(mockItem, { timestamps: false });或者如果是通过模型实例保存,也可以临时修改实例的模型配置:
const mockItem = new ItemModel({ id: "test-item-id", updatedAt: new Date(Date.now() - 6 * 60 * 60 * 1000) // 提前6小时的时间 }); // 临时关闭自动时间戳 mockItem.$__.model.config.timestamps = false; await mockItem.save();直接使用DynamoDB客户端写入Mock数据
绕过Dynamoose模型的自动处理逻辑,直接调用底层DynamoDB客户端的写入接口,这样字段值完全由你控制:const dynamoClient = ItemModel.dynamoose.client; await dynamoClient.putItem({ TableName: "your-items-table-name", Item: { id: { S: "test-item-id" }, updatedAt: { S: new Date(Date.now() - 6 * 60 * 60 * 1000).toISOString() }, // 其他字段按照DynamoDB的AttributeValue格式定义 } }).promise();自定义时间戳逻辑并在测试中Mock
如果项目里是自己实现的时间戳生成逻辑(而非依赖Dynamoose自带功能),可以在测试环境中替换时间生成函数,直接返回需要的Mock时间。比如用Jest的Mock功能:// 假设时间戳生成函数在timeUtils.js中 jest.mock('./timeUtils', () => ({ generateUpdatedAt: () => new Date(Date.now() - 6 * 60 * 60 * 1000) }));
内容的提问来源于stack exchange,提问作者chaimite
相关产品推荐
相关产品推荐

