Как заглушить EntityManager и соединение в TypeORM с помощью Jest - PullRequest
0 голосов
/ 06 мая 2020

У меня есть приложение на Nest JS в Typescript с использованием TypeORM и модульных тестов, написанных с помощью Jest. У меня есть функция, которая использует такие транзакции:

async createMany(users: User[]) {
  await this.connection.transaction(async manager => {
    await manager.save(users[0]);
    await manager.save(users[1]);
  });
}

Это пример из Nest JS docs. Я делаю это примерно таким же образом через this.connection.transaction, но бизнес-лог c другой.

Дело в том, что я хочу сделать модульный тест для проверки этой служебной функции. Поэтому мне нужно как-то издеваться над this.connection и его manager. Или хотя бы менеджер. Я не знаю, как это сделать с помощью Jest. Я не могу создать менеджера без подключения. Я не могу создать фиктивное соединение без менеджера, чтобы вернуться в него.

Использование как TypeORM, так и Jest является стандартным для Nest JS. Должен быть способ писать модульные тесты с транзакциями. Но я не уверен, как это сделать.

Обратите внимание, что я спрашиваю о модульном тестировании, имитирующем ORM. Не интеграционные тесты, которые будут напрямую использовать тестовый экземпляр базы данных.

1 Ответ

2 голосов
/ 07 мая 2020

Вам нужно будет создать TestingModule с имитацией Connection. Что-то вроде этого:

import { Test } from "@nestjs/testing";

describe("UsersService", () => {
    let usersService;
    let connection;
    const mockConnection = () => ({
        transaction: jest.fn()
    });

    beforeEach(async () => {
        const module = await Test.createTestingModule({
            providers: [
                UsersService,
                {
                    provide: Connection,
                    useFactory: mockConnection
                }
            ],
        }).compile();

        usersService = await module.get<UsersService>(UsersService); 
        connection = await modle.get<Connection>(Connection);
    });

    describe("some tests", () => {
        it("should test something", async () => {
            const someMockedUsers = [/* some users */];
            const mockedManager = {
                save: jest.fn()
            }
            connection.transaction.mockImplementation((cb) => {
                cb(mockedManager);
            });

            await userService.createMany(someMockedUsers);

            expect(connection.transaction).toHaveBeenCalled();
            expect(mockedManager.save).toHaveBeenCalledTimes(2);
            // ...

        });
    });


});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...