Ghe*_*man 4 unit-testing typescript jestjs typeorm nestjs
我使用 TypeORM 和用 Jest 编写的单元测试在 Typescript 中获得了一个关于 NestJS 的应用程序。我有一个使用这样的事务的函数:
async createMany(users: User[]) {
await this.connection.transaction(async manager => {
await manager.save(users[0]);
await manager.save(users[1]);
});
}
Run Code Online (Sandbox Code Playgroud)
这是 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);
// ...
});
});
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3874 次 |
最近记录: |