【发布时间】:2021-08-22 06:03:48
【问题描述】:
尝试按照here 的描述编写单元测试,但不知道如何解决此错误
Exception has occurred: Error: Unknown authentication strategy "test-jwt"
at attempt (/home/user/Workspace/project/node_modules/passport/lib/middleware/authenticate.js:190:39)
at authenticate
授权文件
import { Injectable } from "@nestjs/common";
import { AuthGuard } from "@nestjs/passport";
@Injectable()
export class MyGuard extends AuthGuard('test-jwt') { }
测试
import { ExecutionContext } from "@nestjs/common";
import { MyGuard } from "./mygaurd";
it('test' () => {
const context: ExecutionContext = {
switchToHttp: () => context,
getRequest: () => {
return {
headers: {
authorization: `bearer ${jwt}`
}
}
},
getResponse: () => { }
} as unknown as ExecutionContext
const guard = new MyGuard()
expect(guard.canActivate(context)).toBeTrue();
})
实际实现效果很好,我将它添加到控制器中。
@UseGuards(MyGuard)
export class MyController {
我什至不需要将它添加为提供程序或我的设置中的任何内容,因此不确定要包含哪些其他代码。
我实施了一个可能相关的自定义策略
import { Strategy, ExtractJwt } from "passport-jwt";
import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
@Injectable()
export class MyStrategy extends PassportStrategy(Strategy, 'test-jwt') {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'secret'
})
}
async validate(payload) {
...
}
}
当然,MyStrategy 作为提供程序添加到我的应用程序中。
我已经对我的自定义策略进行了单元测试,所以它实际上只是剩下的警卫
编辑:
在下面尝试 Jay 的建议让我更接近了一点,但我仍在苦苦挣扎。
似乎passport.use() 需要名称和策略而不是函数(因此 TS 编译失败)所以我尝试了
import passport, { Strategy } from "passport";
...
passport.use('test-jwt', {
authenticate: (payload) => true
} as Strategy);
错误消失了,但测试现在输出
expect(received).toBeTrue()
Expected value to be true:
true
Received:
{}
还有什么建议吗?
【问题讨论】:
标签: unit-testing testing jestjs passport.js nestjs