单元测试 Nest.js 中的模拟注入服务

时间:2020-12-28 13:09:21

标签: node.js jestjs nestjs

我想测试我的服务(定位服务)。在此位置服务中,我注入了存储库和其他名为 GeoLocationService 的服务,但在尝试模拟此 GeoLocationService 时卡住了。

它给我一个错误

GeolocationService › should be defined

    Nest can't resolve dependencies of the GeolocationService (?). Please make sure that the argument HttpService at index [0] is available in the RootTestModule context.

这是提供者的代码

@Injectable()
export class LocationService {
  constructor(
    @Inject('LOCATION_REPOSITORY')
    private locationRepository: Repository<Location>,

    private geolocationService: GeolocationService, // this is actually what I ma trying to mock
  ) {}

  async getAllLocations(): Promise<Object> {
return await this.locationRepository.find()
  }
....
}

这是测试代码

describe('LocationService', () => {
  let service: LocationService;
  let repo: Repository<Location>;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [GeolocationModule],
      providers: [
        LocationService,
        {
          provide: getRepositoryToken(Location),
          useClass: Repository,
        },
      ],
    }).compile();

    service = module.get<LocationService>(LocationService);
    repo = module.get<Repository<Location>>(getRepositoryToken(Location));
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });
});

1 个答案:

答案 0 :(得分:1)

您应该提供 imports: [GeolocationModule] 的模拟,而不是添加 GeolocationService。这个模拟应该具有与 GeolocationService 相同的方法名称,但它们都可以被存根 (jest.fn()) 或者它们可以有一些返回值 (jest.fn().mockResolved/ReturnedValue())。通常,自定义提供程序(添加到 providers 数组中)如下所示:

{
  provide: GeolocationService,
  useValue: {
    method1: jest.fn(),
    method2: jest.fn(),
  }
}

You can find a large sample of mocks in this repository