gpt4 book ai didi

typescript - 如何使用 Jest 在 TypeORM 中 stub EntityManager 和 Connection

转载 作者:行者123 更新时间:2023-12-04 11:59:08 25 4
gpt4 key购买 nike

我使用 TypeORM 和用 Jest 编写的单元测试在 Typescript 中获得了一个关于 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带着 mock 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);
// ...

});
});


});

关于typescript - 如何使用 Jest 在 TypeORM 中 stub EntityManager 和 Connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61637468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com