testing - Nest无法解析Service的依赖关系

标签 testing mocking nestjs typeorm

我正在尝试使用模拟存储库(typeorm)编写服务测试,就像nestjs文档中提供的那样。但我猜我的测试技能根本就没有什么好处

像这样的简单服务 apex.service.ts

@Injectable()
export class ApexService {
private _kafkaClient: ClientKafka;

constructor(
    private readonly _apexRepository: ApexRepository,
    private readonly _kafkaProducer: KafkaProducer,
    private readonly _someService: SomeService,
  ) {}
 // ... code here
}

...并进行测试 顶点规范.ts

// ... imports

export type MockType<T> = {
  [P in keyof T]?: jest.Mock<{}>;
};

export const repositoryMockFactory: () => MockType<Repository<any>> = jest.fn(
  () => ({
    findOne: jest.fn((entity) => entity),
    create: jest.fn((entity) => entity.id),
    save: jest.fn((entity) => entity.id),
    // ...
  }),
);

describe('ApexService', () => {
  let service: ApexService;
  let repositoryMock: MockType<Repository<CompanyEntity>>;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        ApexService,
        {
          provide: getRepositoryToken(CompanyEntity),
          useFactory: repositoryMockFactory,
        },
        PKUchetProducer,
      ],
    }).compile();
    service = module.get<ApexService>(ApexService);
    repositoryMock = module.get(getRepositoryToken(CompanyEntity));
  });

  it('should create company', async () => {
    const dto = {
      bin: '00000000000',
    };

    const company = {
      id: 0,
    };

    repositoryMock.create.mockReturnValue(company);
    expect(async () => service.createCompany(dto)).toEqual({
      data: 0,
      statusCode: 200,
    });
  });
});

但是当我运行测试时出现此错误:

● ApexService › should create company

    Nest can't resolve dependencies of the ApexService (?, KafkaProducer, SomeService). Please make sure that the argument ApexRepository at index [0] is available in the RootTestModule context.

apex.respository.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Company } from '../../shared/domain/company';
import { ICompany } from '../../shared/domain/interfaces/company.interface';
import { Repository } from 'typeorm';
import { CompanyEntity } from '../entities/company.entity';
import { IApexRepository } from '../interfaces/apex-repository.interface';

@Injectable()
export class ApexRepository implements IApexRepository {
  private _apexRepository: Repository<CompanyEntity>;

  constructor(
    @InjectRepository(CompanyEntity)
    private readonly apexRepository: Repository<CompanyEntity>,
  ) {
    this._apexRepository = this.apexRepository;
  }

  public async getCompanyByBIN(bin: string): Promise<Company> {
    const company = await this._apexRepository.findOne({
      where: { bin },
    });

    return Company.transform(company);
  }

  public async createCompany(props: ICompany): Promise<number> {
    const company = this._apexRepository.create(Company.create(props));
    return company.id;
  }

  public async updateCompany(props: ICompany): Promise<number> {
    const company = await this._apexRepository.save(Company.transform(props));
    return company.id;
  }
}

问题是什么,请解释一下...

最佳答案

getRepositoryToken(CompanyEntity) 更改为 getRepositoryToken(ApexRepository)

编辑:

由于您的存储库类不是自定义存储库而是标准提供程序,因此您必须将其注册到提供程序列表中:

      providers: [
        ApexService,
        {
          provide: getRepositoryToken(CompanyEntity),
          useFactory: repositoryMockFactory,
        },
        { provide: ApexRepository, useValue: yourStub },
        PKUchetProducer,
      ],

关于testing - Nest无法解析Service的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69864094/

相关文章:

internet-explorer - 从版本 9 及更高版本测试不同版本的 IE 是否有任何值(value)

asp.net - 什么是最好的负载测试工具?

java - 如何在 JMockit、PowerMocks 等任何模拟框架中模拟静态方法?

XDocument.Load() 和 XDocument.Save() 的测试方法

node.js - NestJS 拦截器 - 处理 .pipe() 中的错误

nestjs - 如何使用 DTO 将响应设置为 swagger 响应中的数组

testing - 在 Hapi.js 中调用 server.inject() POST 请求不调用处理程序

python - 使用 Lettuce 的 BDD 测试能否替代项目中的所有其他形式的测试?

c# - 无法使用 Rhino Mocks 使用具有数组参数的构造函数模拟类

node.js - NestJS 阻止服务器在开发中重新加载