最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

使用NestJS,Mysql和Passport模块上的TypeORM进行单元和e2e测试

网站源码admin21浏览0评论

使用NestJS,Mysql和Passport模块上的TypeORM进行单元和e2e测试

使用NestJS,Mysql和Passport模块上的TypeORM进行单元和e2e测试

我目前正在接管使用NestJS,Mysql上的typeorm和护照包进行身份验证的后端。我目前正在尝试根据NestJS文档编写单元测试和e2e测试,但我无法真正使其正常工作。

我已经尝试导入根AppModule或单个模块。在第一种情况下,它抱怨无法连接到数据库。我已经为此覆盖了配置提供程序,使其可以在测试的Sqlite数据库上运行,但是护照模块仍然会引发一个错误,指出无法访问未定义的属性挑战。

所以,让我们从端到端测试开始,这是我的应用程序模块:


  imports: [
    ConfigModule,
    CoreModule,
    Logger,
    AuthModule,
    TypeOrmModule.forRootAsync({
      imports: [TypeOrmConfigService],
      useClass: TypeOrmConfigService,
    }),
    UsersModule,
    CoreModule,
    DataModule,
    InitializationModule,
    TokensModule,
    ProjectsModule,
    ReportsModule,
    AccountsModule,
    NotificationModule,
    FaqModule,
    StrategicModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

这是我的e2e-spec文件,在其中我覆盖了config服务以设置临时数据库:

class MockTypeOrmConfigService implements TypeOrmOptionsFactory {
  createTypeOrmOptions(): TypeOrmModuleOptions {
    return {
      type: 'sqlite' as any,
      database: ':memory:',
      synchronize: true,
      dropSchema: true,
      entities: [`../src/**/*.entity{.ts,.js}`],
    };
  }
}
const mockTypeOrmConfigService = new MockTypeOrmConfigService();

describe('AppController (e2e)', () => {
  let app: INestApplication;

  beforeAll(async () => {
    const moduleFixture = await Test.createTestingModule({
      imports: [AppModule],
    })
      .overrideProvider(TypeOrmConfigService)
      .useValue(mockTypeOrmConfigService)
      pile();

    app = moduleFixture.createNestApplication();
    await app.init();
  });

  it('/faq (GET)', () => {
    return request(app.getHttpServer())
      .get('/faq')
      .expect(200)
      .expect('Hello World!');
  });
});

如果我的架构定义中只有很大一部分是基于mysql字段(例如json,复合自动增量和blob),则此方法实际上会起作用。因此,我的下一个尝试是使用单个控制器模块来创建应用程序并在其中运行e2e测试。假设我有这个控制器:

@Controller('faq')
@UseGuards(AuthGuard())
@ApiBearerAuth()
export class FaqController {
  constructor(private readonly faqService: FaqService) {}

  @Get()
  @ApiOkResponse({ type: FaqEntryDto, isArray: true })
  async getAll(): Promise<FaqEntryDto[]> {
    return this.faqService.findAll();
  }

  @Post()
  @UseGuards(new RolesGuard(UserRole.Admin))
  async create(@Body() body: FaqEntryDto) {
    return this.faqService.create(body);
  }

  @Put('/:id')
  @UseGuards(new RolesGuard(UserRole.Admin))
  async update(
    @Param('id', new ParseIntPipe()) id: number,
    @Body() body: FaqEntryDto
  ) {
    return this.faqService.update(id, body);
  }

  @Delete('/:id')
  @UseGuards(new RolesGuard(UserRole.Admin))
  async delete(@Param('id', new ParseIntPipe()) id: number) {
    return this.faqService.delete(id);
  }
}

这是我的测试(在该测试中,我也覆盖了存储库提供者:

ntroller (e2e)', () => {
  let app: INestApplication;

  beforeAll(async () => {
    const moduleFixture = await Test.createTestingModule({
      imports: [FaqModule],
      providers: [FaqService],
    })
      .overrideProvider(getRepositoryToken(FaqEntity))
      .useValue({})
      pile();

    app = moduleFixture.createNestApplication();
    await app.init();
  });

  it('/ (GET)', () => {
    return request(app.getHttpServer())
      .get('/faq')
      .expect(200)
      .expect('Hello World!');
  });
});

然后,我将总是从护照验证模块获取消息,例如:

[Nest] 4976   - 8/29/2019, 8:27:00 AM   [ExceptionHandler] In order to use "defaultStrategy", please, ensure to import PassportModule in each place where AuthGuard() is being used. Otherwise, passport won't work correctly.
[Nest] 4976   - 8/29/2019, 8:27:00 AM   [ExceptionHandler] Cannot read property 'challenge' of undefined +44ms
TypeError: Cannot read property 'challenge' of undefined

我也尝试过在overrideGuard上使用AuthGuard,但结果完全相同。

另外,我想使用typeorm-fixture包,但在这方面我也遇到了很大麻烦。

回答如下:

请在您的@UseGuards(AuthGuard())装饰器中添加'jwt'。否则,您将得到该错误。 -@UseGuards(AuthGuard('jwt'))

发布评论

评论列表(0)

  1. 暂无评论