在NestJS中,为什么使用TestingModule.get()和EntityManager获取的对象引用不同的实体?

问题描述 投票:0回答:1

问题:

在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?
  • 如果可以,该怎么办?

我尝试了各种方法来解决这个问题,并确认通过moduleRef获取的对象返回了一个新的EntityManager。

typescript testing jestjs nestjs typeorm
1个回答
0
投票

就我而言,我在创建测试模块时导入了 TypeORM 模块。因此,我假设当我从 moduleRef 获取实体管理器时创建了一个新的实体管理器,并通过删除相关部分解决了该问题。

© www.soinside.com 2019 - 2024. All rights reserved.