如何使用 Jest 在 TypeORM 中存根 EntityManager 和 Connection

2023-11-27

我在 Typescript 中使用 TypeORM 和用 Jest 编写的单元测试在 NestJS 上获得了一个应用程序。我有一个使用这样的事务的函数:

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

这是 NestJS 文档中的一个示例。我大致以同样的方式通过this.connection.transaction但业务逻辑不同。

问题是我想做一个单元测试来测试这个服务功能。所以我需要以某种方式嘲笑两者this.connection和它的manager。或者至少是经理。我不知道如何使用 Jest 来做到这一点。如果没有连接,我无法创建管理器。我无法创建没有管理器返回的模拟连接。

同时使用 TypeORM 和 Jest 是 NestJS 中的标准。必须有一种方法来编写带有事务的单元测试。但我不知道该怎么做。

请注意,我问的是单元测试模拟 ORM。不是直接使用测试数据库实例的集成测试。


你需要创建一个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);
            // ...

        });
    });


});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Jest 在 TypeORM 中存根 EntityManager 和 Connection 的相关文章

随机推荐