问题:
在NestJS中,为什么使用TestingModule.get()和EntityManager获取的对象引用不同的实体?
背景:
使用 getEntityManagerToken() 获得的对象是一个新的、未模拟的 EntityManager。 通过 getRepositoryToken() 获得的对象是创建 moduleRef 时模拟的 Repository。
代码:
import { Test, TestingModule } from '@nestjs/testing';
import { getEntityManagerToken, getRepositoryToken } from '@nestjs/typeorm';
import { EntityManager } from 'typeorm';
const mockEntityManager = () => ({
query: jest.fn(),
find: jest.fn(),
findOne: jest.fn(),
});
describe('TEST', () => {
let sut: Service;
let replicaRepositoryStub: any;
let replicaeManagerStub: any;
beforeEach(async () => {
const moduleRef: TestingModule = await Test.createTestingModule({
providers: [
Service,
{
provide: getEntityManagerToken('replica'),
useValue: mockEntityManager(),
},
{
provide: getRepositoryToken(Entity, 'replica'),
useValue: mockEntityManager(),
},
],
}).compile();
sut = moduleRef.get<Service>(Service);
replicaRepositoryStub = moduleRef.get(getRepositoryToken(Entity, 'replica'));
replicaeManagerStub = moduleRef.get(getEntityManagerToken('replica'));
});
it('test1', async () => {
replicaRepositoryStub.findOne.mockResolvedValue('test'); // it's ok
replicaeManagerStub.findOne.mockResolvedValue('test'); // This code causes an error to be thrown.
});
});
错误代码:
replicaManagerStub.findOne.mockResolvedValue is not a function
TypeError: replicaManagerStub.findOne.mockResolvedValue is not a function
at Object.<anonymous> (PATH)
问题:
我尝试了各种方法来解决这个问题,并确认通过moduleRef获取的对象返回了一个新的EntityManager。
就我而言,我在创建测试模块时导入了 TypeORM 模块。因此,我假设当我从 moduleRef 获取实体管理器时创建了一个新的实体管理器,并通过删除相关部分解决了该问题。