Как издеваться над QueryIterator, возвращаемым Datamapper DynamoDb с Jest? - PullRequest
2 голосов
/ 30 апреля 2019

Я пытаюсь написать модульные тесты для класса TypeScript, который вызывает DynamoDb.Это то, что у меня так далеко.

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 ..., поэтому мне нужна функция .next для возврата.

Чтобы протестировать тест, я добавил console.log(await queryIterator.next()); к моей функции запроса dynamicoDb.

Но когда я пытаюсь запустить его, ответом будет:

TypeError: queryIterator.next не является функцией

в этой строке журнала.

Итак, очевидно, что mockQueryCall.mockReturnValue(mockQueryIterator); либо не выполняет свою работу и не возвращает мой mockQueryIterator, либо const mockQueryIterator = <jest.Mock<QueryIterator<DataObject>>>QueryIterator; неправильно применяет тип к mockQueryIterator.Но я не знаю, как исправить любую из этих вещей.

1 Ответ

0 голосов
/ 08 мая 2019

После некоторых проб и ошибок я придумал что-то, что работает.Он высмеивает функцию 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]);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...