首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Jest模拟DynamoDb Datamapper返回的DynamoDb?

如何用Jest模拟DynamoDb Datamapper返回的DynamoDb?
EN

Stack Overflow用户
提问于 2019-04-30 01:24:13
回答 1查看 2K关注 0票数 8

我试图为调用TypeScript的DynamoDb类编写单元测试。到目前为止,这就是我所掌握的。

代码语言:javascript
复制
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函数。

为了测试测试,我将console.log(await queryIterator.next());添加到dynamoDb查询函数中。

但是当我尝试运行它时,我的反应是:

TypeError: queryIterator.next不是一个函数

在日志线上。

因此,很明显,mockQueryCall.mockReturnValue(mockQueryIterator);没有完成它的工作并返回我的mockQueryIterator,或者const mockQueryIterator = <jest.Mock<QueryIterator<DataObject>>>QueryIterator;没有正确地将类型应用于mockQueryIterator。但我不知道怎么解决这两件事。

EN

回答 1

Stack Overflow用户

发布于 2019-05-08 00:00:13

经过一些尝试和错误之后,我想出了一些有用的东西。它模拟了QueryIterator的Symbol.iterator函数。

代码语言:javascript
复制
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]);
    });
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55912756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档