gpt4 book ai didi

javascript - 在 Nest JS 中模拟 HTTP 拦截器

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:27 25 4
gpt4 key购买 nike

我有一个核心模块,它在 Nest js 中提供身份验证拦截器。这是核心模块。

@Module({
imports: [
providers: [{
provide: APP_INTERCEPTOR,
useClass: LoggerInterceptor
}
]
})
export class ConfModule {
}

此conf模块由app模块导入。

@Module({
imports: [
ConfModule
]
})
export class AppModule {
}

这是我的LoggerInterceptor

@Injectable()
export class LoggerInterceptor implements NestInterceptor {
constructor(private readonly reflector: Reflector, private readonly connection: Connection) {
}

async intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
// tslint:disable-next-line:no-console
console.log(context.switchToHttp().getRequest().body);
await this.connection.createEntityManager().save(context.switchToHttp().getRequest().body);
return next.handle();
}
}

我目前正在编写 E2E 测试,并且想要重写记录器拦截器。这是我的 MockLoggerInterceptor

export class MockLoggerInterceptor extends LoggerInterceptor {
reflex: Reflector;
conn: Connection;

constructor(reflector: Reflector, connection: Connection) {
super(reflector, connection);
this.reflex = reflector;
this.conn = connection;
}

// @ts-ignore
async intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
// tslint:disable-next-line:no-console
console.log(context.switchToHttp().getRequest().body);
await this.conn.createEntityManager().save(context.switchToHttp().getRequest().body);
return next.handle();
}

}

这是我的测试套件

describe('PermissionController', () => {
let applicationContext: INestApplication;
let connection: Connection;
let testUtils: TestUtils;
let appHeader: App;

beforeAll(async () => {
const moduleRef: TestingModule = await Test.createTestingModule({
imports: [AppModule]
}).overrideInterceptor(LoggerInterceptor).useClass(MockLoggerInterceptor).compile();

applicationContext = moduleRef.createNestApplication();
connection = getConnection();
await applicationContext.init();
testUtils = new TestUtils(connection);
appHeader = await testUtils.getAuthorisedApp();

});
it('Test of permission can be created', async () => {
await request(applicationContext.getHttpServer())
.post('/permissions')
.set({
'X-APP-CODE': appHeader.code,
'X-APP-TOKEN': appHeader.token,
'Authorisation': appHeader.token
})
.send(
{
permissionName: 'newPermission'

}
).expect(201);
});

afterAll(async () => {
await connection.close();
await applicationContext.close();

});
});

我的测试仍然使用conf模块记录器而不是测试记录器。显然还有其他用例,但这是我能提供的最好的。

最佳答案

您必须使用overrideInterceptor而不是overrideProvider,因为模块的providers数组中没有提供拦截器:

.overrideInterceptor(LoggerInterceptor).useClass(MockLoggerInterceptor)

关于javascript - 在 Nest JS 中模拟 HTTP 拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60185165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com