我有一个看起来像这样的函数:
function connect() {
const secret = 'secret';
const key = 'key';
const region = 'region';
const client = new AWS.DynamoDB({
secret,
key,
region
});'
return new AWS.DynamoDB.DocumentClient({ service: client })
}
我想测试功能连接。我已经像这样嘲笑DynamoDB构造函数:
// See https://stackoverflow.com/questions/47606545/mock-a-dependencys-constructor-jest
jest.mock('aws-sdk', () => {
const DynamoDB = jest.fn().mockImplementation(() => {
return {};
});
return {
DynamoDB,
};
});
但是,这意味着DocumentClient
构造函数失败。我也该如何嘲笑?
答案 0 :(得分:4)
这对我有用:
const mockDynamoDbPut = jest.fn().mockImplementation(() => {
return {
promise() {
return Promise.resolve({});
}
};
});
jest.doMock('aws-sdk', () => {
return {
DynamoDB: jest.fn(() => ({
DocumentClient: jest.fn(() => ({
put: mockDynamoDbPut
}))
}))
};
});
我希望它对您也有帮助。
此致
大卫。
答案 1 :(得分:0)
0
可能会调用某些DocumentClient
方法,因此只需定义这些方法存根即可。例如,client
将在您的代码中使用DocumentClient
batchGetItem
答案 2 :(得分:0)
这是在TypeScript中使用笑话对我有用的东西:
// blabla.test.ts
import { DynamoDB } from 'aws-sdk';
import { ConsumerClass } from '../consumer-class';
import { DependencyConsumerClass } from '../dependency-consumer-class';
/*
* Inside consumerClassInstance.save() is calling this.dynamo.putItem({...}).promise();
*/
jest.mock('aws-sdk', () => {
return {
DynamoDB: jest.fn(() => {
return {
putItem: jest.fn(() => {
return {
promise: jest.fn(() => true)
};
})
};
})
};
});
test('sample test', async () => {
const dependencyConsumerClass = new DependencyConsumerClass();
const consumerClassInstance = new ConsumerClass(dependencyConsumerClass, new DynamoDB());
const result = await consumerClassInstance.save();
console.log(result);
});
答案 3 :(得分:0)
基于上面来自 duxtinto 的评论:
在我的情况下(如果我没看错,在 OP 的情况下),DynamoDB 不是作为函数调用的,而是一个带有 DocumentClient 字段的对象,所以这对我有用:
jest.mock('aws-sdk', () => {
return {
DynamoDB: { // just an object, not a function
DocumentClient: jest.fn(() => ({
put: mockDynamoDbPut
}))
}
}});
答案 4 :(得分:-1)
Jest为运行测试提供了DynamoDB集成。参见this document,参见3. Configure DynamoDB client
:
const {DocumentClient} = require('aws-sdk/clients/dynamodb');
const isTest = process.env.JEST_WORKER_ID;
const config = {
convertEmptyValues: true,
...(isTest && {endpoint: 'localhost:8000', sslEnabled: false, region: 'local-env'})
};
const ddb = new DocumentClient(config);
我想您可以将DynamoDB客户端配置抽象(如果尚未使用)到其自己的模块文件中,然后将该客户端导出,以便可以在其他地方使用它,并且在运行的Jest测试时,该客户端将配置为指向您按照Jest DynamoDB文档的其他步骤设置的模拟DynamoDB服务器/表。