我在 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(使用前将#替换为@)