如何使用Jest在TypeORM中存根EntityManager和连接 [英] How to stub EntityManager and Connection in TypeORM with Jest
问题描述
我使用TypeORM和用Jest编写的单元测试在TypeScript的NestJS上获得了一个应用程序.我有一个使用这样的事务的函数:
I got an app on NestJS in Typescript using TypeORM and unit-tests written with Jest. I have a function that uses transactions like this:
async createMany(users: User[]) {
await this.connection.transaction(async manager => {
await manager.save(users[0]);
await manager.save(users[1]);
});
}
这是NestJS文档中的一个示例.我通过this.connection.transaction
大致以相同的方式进行操作,但是业务逻辑不同.
That's an example from NestJS docs. I do it roughly in the same way via this.connection.transaction
but the business-logic is different.
我想做一个单元测试来测试这个服务功能.因此,我需要以某种方式模拟this.connection
及其manager
.或至少是经理.我不确定如何使用Jest做到这一点.没有连接我就无法创建经理.我无法在没有管理员返回的情况下创建模拟连接.
The thing is I want to make a unit-test to test this service function. So I need to somehow mock both this.connection
and its manager
. Or at least the manager. I'm not sure how to do it using Jest. I can't create a manager without a connection. I can't create a mock connection with no manager to return inside it.
在NestJS中,同时使用TypeORM和Jest是标准的.必须有一种方法来编写带有事务的单元测试.但是我不确定该怎么做.
Using both TypeORM and Jest is standard in NestJS. There have to be a way to write unit-tests with transactions. But I am not sure how to do it.
请注意,我询问的是单元测试模拟ORM.不是直接使用测试数据库实例的集成测试.
Note that I am asking about unit-test mocking ORM. Not integration tests that would directly use a testing db instance.
推荐答案
您需要使用模拟的Connection
创建一个TestingModule
.像这样的东西:
You would need to create a TestingModule
with a mocked Connection
. Something likes this:
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);
// ...
});
});
});
这篇关于如何使用Jest在TypeORM中存根EntityManager和连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!