简体   繁体   English

Nest.js 测试无法覆盖 Provider

[英]Nest.js testing cannot override Provider

I have a problem with overriding provider in nest.js application for testing.我在测试 Nest.js 应用程序时遇到了覆盖提供程序的问题。 My stats.controller.spec.ts:我的 stats.controller.spec.ts:

import { StatsService } from './services/stats.service';
import { StatsController } from './stats.controller';

describe('StatsController', () => {
  let controller: StatsController;

  const mockStatsService = {};

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [StatsController],
      providers: [StatsService],
    })
      .overrideProvider(StatsService)
      .useValue(mockStatsService)
      .compile();

    controller = module.get<StatsController>(StatsController);
  });

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

My stats.controller.ts:我的stats.controller.ts:

import { Controller, Get } from '@nestjs/common';
import { StatsService } from './services/stats.service';

@Controller('stats')
export class StatsController {
  constructor(private statsService: StatsService) {}

  @Get('weekly')
  getWeeklyStats() {
    return this.statsService.getWeeklyStats();
  }

  @Get('monthly')
  getMonthlyStats() {
    return this.statsService.getMonthlyStats();
  }
}

And my stats.service.ts:还有我的 stats.service.ts:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Trip } from 'src/trips/trip.entity';
import { from, map } from 'rxjs';
import { DatesService } from 'src/shared/services/dates.service';

@Injectable()
export class StatsService {
  constructor(
    @InjectRepository(Trip) private tripRepository: Repository<Trip>,
    private datesServices: DatesService,
  ) {}
 //some code here
}

And after running test I get following errors: Cannot find module 'src/trips/trip.entity' from 'stats/services/stats.service.ts' I would really appreciate some help.运行测试后,我收到以下错误:无法从“stats/services/stats.service.ts”中找到模块“src/trips/trip.entity”我非常感谢一些帮助。

The error is unrelated to if you're using a custom provider or overrideProvider .该错误与您使用的是自定义提供程序还是overrideProvider无关。 Jest by default doesn't understand absolute imports by default, and you need to use the moduleNameMapper option to tell Jest how to resolve src/ imports.默认情况下,Jest 默认不理解绝对导入,您需要使用moduleNameMapper选项告诉 Jest 如何解析src/导入。 Usually something like通常像

{
  "moduleNameMapper": {
    "^src/(.*)$": "<rootDir>/$1"
  }
}

Assuming rootDir has been set to src假设rootDir已设置为src

You can override the provider by using the below code in nest js:您可以通过在嵌套 js 中使用以下代码来覆盖提供程序:

import { StatsService } from './services/stats.service';
import { StatsController } from './stats.controller';

describe('StatsController', () => {
  let controller: StatsController;

  const mockStatsService = {};

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [StatsController],
      providers: [{
        provide: StatsService,
       useValue: mockStatsService 
      }],
    })
      .compile();

    controller = module.get<StatsController>(StatsController);
  });

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM