本文介绍了Nestjs单元测试模拟方法保护的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已经开始与NestJS合作,有一个关于嘲弄警卫的问题用于单元测试。我正在尝试测试附加了Method Guard的基本HTTPcontroller
。
我的问题开始于我向警卫注入服务时(我需要警卫的ConfigService
)。
运行测试时,DI无法解析防护
● AppController › root › should return "Hello World!"
Nest can't resolve dependencies of the ForceFailGuard (?). Please make sure that the argument at index [0] is available in the _RootTestModule context.
我的强制故障保护:
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { ConfigService } from './config.service';
@Injectable()
export class ForceFailGuard implements CanActivate {
constructor(
private configService: ConfigService,
) {}
canActivate(context: ExecutionContext) {
return !this.configService.get().shouldFail;
}
}
规格文件:
import { CanActivate } from '@nestjs/common';
import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ForceFailGuard } from './force-fail.guard';
describe('AppController', () => {
let appController: AppController;
beforeEach(async () => {
const mock_ForceFailGuard = { CanActivate: jest.fn(() => true) };
const app: TestingModule = await Test
.createTestingModule({
controllers: [AppController],
providers: [
AppService,
ForceFailGuard,
],
})
.overrideProvider(ForceFailGuard).useValue(mock_ForceFailGuard)
.overrideGuard(ForceFailGuard).useValue(mock_ForceFailGuard)
.compile();
appController = app.get<AppController>(AppController);
});
describe('root', () => {
it('should return "Hello World!"', () => {
expect(appController.getHello()).toBe('Hello World!');
});
});
});
我找不到有关此问题的示例或文档。我是遗漏了什么,还是这是一个真正的问题?
感谢您的帮助,谢谢。推荐答案
提供的示例repo有3个问题:
Nestjs v6.1.1中存在错误,
.overrideGuard()
-请参阅https://github.com/nestjs/nest/issues/2070我已确认在6.5.0中已修复。
ForceFailGuard
在providers
中,但其依赖项(ConfigService
)在已创建的TestingModule
中不可用。如果要模拟
ForceFailGuard
,只需将其从providers
中删除,让.overrideGuard()
执行其工作即可。mock_ForceFailGuard
将CanActivate
作为属性,而不是canActivate
。
工作示例(nestjs v6.5.0):
import { CanActivate } from '@nestjs/common';
import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ForceFailGuard } from './force-fail.guard';
describe('AppController', () => {
let appController: AppController;
beforeEach(async () => {
const mock_ForceFailGuard: CanActivate = { canActivate: jest.fn(() => true) };
const app: TestingModule = await Test
.createTestingModule({
controllers: [AppController],
providers: [
AppService,
],
})
.overrideGuard(ForceFailGuard).useValue(mock_ForceFailGuard)
.compile();
appController = app.get<AppController>(AppController);
});
describe('root', () => {
it('should return "Hello World!"', () => {
expect(appController.getHello()).toBe('Hello World!');
});
});
});
这篇关于Nestjs单元测试模拟方法保护的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!