【问题标题】:How do I mock the QueryIterator returned by the DynamoDb Datamapper with Jest?如何使用 Jest 模拟 DynamoDb Datamapper 返回的 QueryIterator?
【发布时间】:2019-09-18 15:11:03
【问题描述】:

我正在尝试为调用 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 = &lt;jest.Mock&lt;QueryIterator&lt;DataObject&gt;&gt;&gt;QueryIterator; 没有正确地将类型应用于 mockQueryIterator。但我不知道如何解决这些问题。

【问题讨论】:

    标签: typescript amazon-dynamodb jestjs


    【解决方案1】:

    经过反复试验,我想出了一些可行的方法。它模拟了 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]);
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2019-06-19
      • 2021-11-04
      • 1970-01-01
      • 2019-10-27
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多