在我的 TypeScript 应用程序中,我在 AWS SDK DynamoDB 的 INV_DATE DATE DEFAULT SYSDATE NOT NULL,
函数上有包装函数,我想为这些包装函数编写一些单元测试。包装函数实现如下:
DocumentClient
我不想在 DDB 表中执行任何实际的端到端放置/获取,而只是模拟 AWS 开发工具包函数。但是,我在模拟 dynamodb.ts
import DynamoDB from 'aws-sdk/clients/dynamodb'
import AWS from 'aws-sdk/global';
const config: DynamoDB.Types.ClientConfiguration = {
httpOptions: {
connectTimeout: 500,
timeout: 1000,
}
}
const service = new DynamoDB(config);
const ddb = new DynamoDB.DocumentClient({ service });
export const putItem = wrap(ddb.put.bind(ddb));
const wrap =
<I, O>(fnc: (args: I) => AWS.Request<O, AWS.AWSError>) => (args: I) => {
return fnc(args).promise()
.then(result => {
log(result);
return result;
});
};
和 DynamoDB
的构造函数时遇到了一些问题。
目前我的单元测试文件是这样的:
DynamoDB.DocumentClient
运行这个测试给了我一个这样的错误:
dynamodb.test.ts
import * as sut from "../dynamodb"
import DynamoDB from "aws-sdk/clients/dynamodb";
jest.mock("aws-sdk/clients/dynamodb", () => {
return jest.fn().mockImplementation(() => {
const documentClient = jest.fn().mockImplementation(() => {
const awsSdkPromiseResponse = jest.fn().mockReturnValue(Promise.resolve(true));
const putFn = jest.fn().mockImplementation(() => ({promise: awsSdkPromiseResponse}))
return {
put: putFn,
get: putFn,
delete: putFn,
batchGet: putFn,
batchWrite: putFn,
query: putFn,
scan: putFn,
update: putFn,
transactGet: putFn,
transactWrite: putFn
}
})
return { DocumentClient: documentClient };
});
});
test('AWS.DynamoDB is called', async() => {
await sut.putItem({
TableName: 'test',
Item: {
pk: 'test_pk',
sk: 'test_sk',
email: 'test@test.com'
}
})
expect(DynamoDB).toHaveBeenCalledTimes(1)
})
似乎 TypeError: _dynamodb.default.DocumentClient is not a constructor
是位于命名空间 DocumentClient
中的静态属性,我在上面模拟 DynamoDB
中尝试做的是将 DynamoDB
定义为DocumentClient
类的实例属性。我知道这是不正确的,我已经在互联网上搜索类似的东西,但找不到任何东西。
问题还在于我想在我的测试文件中模拟 DynamoDB
和 DynamoDB
类的构造函数。我发现一个 article 类似于我正在尝试做的,但这里的手动模拟也无济于事。通过这个,我无法同时模拟 DocumentClient
和 DynamoDB
我对 TypeScript 很陌生,也许我正在做一些完全愚蠢的事情。任何指针表示赞赏!