我正在尝试为调用DynamoDb的TypeScript类编写单元测试。这就是到目前为止。
import {DataMapper, QueryIterator} from '@aws/dynamodb-data-mapper';
import DynamoDB = require("aws-sdk/clients/dynamodb");
jest.mock("aws-sdk/clients/dynamodb");
jest.mock("@aws/dynamodb-data-mapper");
describe("queryDynamoDb", () => {
let myRepository = new MyRepository();
const mockQueryCall = jest.fn();
DataMapper.prototype.query = mockQueryCall;
test("queriesDynamoDb", async () => {
const mockQueryIterator = <jest.Mock<QueryIterator<DataObject>>>QueryIterator;
mockQueryIterator.prototype.next.mockReturnValueOnce(getExpectedReturnObjectsValues())
mockQueryCall.mockReturnValue(mockQueryIterator);
let responseObjects = await myRepository.queryDynamoDb(testIdString);
// Validate response Objects
})
});
该方法使用for ... of循环遍历响应,因此我需要返回.next函数。
为了测试测试,我在dynamoDb查询函数中添加了console.log(await queryIterator.next());
。
但是当我尝试运行它时,响应为:
在该日志行上TypeError:queryIterator.next不是函数
。
因此,很明显mockQueryCall.mockReturnValue(mockQueryIterator);
不在执行其工作并返回了我的mockQueryIterator,或者const mockQueryIterator = <jest.Mock<QueryIterator<DataObject>>>QueryIterator;
没有将类型正确地应用到mockQueryIterator。但是我不知道该如何解决这些问题。
答案 0 :(得分:0)
经过反复试验,我想出了一些可行的方法。它模拟了QueryIterator的Symbol.iterator
函数。
import {DataMapper, QueryIterator, StringToAnyObjectMap} from '@aws/dynamodb-data-mapper';
import createMockInstance from 'jest-create-mock-instance';
describe('alert service test', () => {
test('find by user id', async () => {
const mapper = createMockInstance(DataMapper);
const qi: QueryIterator<StringToAnyObjectMap> = createMockInstance(QueryIterator);
// @ts-ignore
qi[Symbol.iterator] = jest.fn(() => [1, 2, 3].values());
mapper.query.mockReturnValue(qi);
// @ts-ignore any query arguments will do
const results = mapper.query();
const resultArray = [];
for await (const o of results) {
resultArray.push(o);
}
expect(resultArray).toEqual([1, 2, 3]);
});
});