Unit testing 如何为JWT策略编写单元测试用例

Unit testing 如何为JWT策略编写单元测试用例,unit-testing,jestjs,passport.js,passport-local,passport-jwt,Unit Testing,Jestjs,Passport.js,Passport Local,Passport Jwt,我是passport.js的新手,尝试为我的JWT策略介绍单元测试用例。有人能建议怎么做吗 // Setup JWT strategy for all requests passport.use( new JWTStrategy( { jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), secretOrKey: JWT_PRIVATE_KEY, }, async (jwtPaylo

我是passport.js的新手,尝试为我的JWT策略介绍单元测试用例。有人能建议怎么做吗

// Setup JWT strategy for all requests
passport.use(
  new JWTStrategy(
    {
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: JWT_PRIVATE_KEY,
    },
    async (jwtPayload: any, done: any) => {
      const isUser = jwtPayload.type === EntityType.User;
      const model = isUser ? userModel : vendorModel;
      try {
        const document = await model.findOne({ _id: jwtPayload.id });
        if (document) {
          return done(null, jwtPayload);
        } else {
          return done(null, false);
        }
      } catch (err) {
        return done(err, false);
      }
    },
  ),
);
单元测试解决方案:

index.ts

从“passport”导入passport;
从“passport jwt”导入{策略作为JWTStrategy,提取jwt};
从“/models”导入{userModel,vendorModel,EntityType};
const JWT_PRIVATE_KEY='secret 123';
passport.use(
新JWT战略(
{
jwtFromRequest:ExtractJwt.FromAuthHeaderAsberToken(),
秘钥:JWT_私钥,
},
异步(jwtPayload:any,done:any)=>{
console.log('123123');
const isUser=jwtPayload.type==EntityType.User;
const model=isUser?userModel:vendorModel;
试一试{
const document=wait model.findOne({u id:jwtPayload.id});
如果(文件){
返回完成(空,jwtPayload);
}否则{
返回完成(null,false);
}
}捕捉(错误){
返回完成(错误、错误);
}
},
),
);
models.ts

导出枚举EntityType{
用户='User',
}
导出常量用户模型={
异步findOne(opts){
返回“真实用户文档”;
},
};
导出常量vendorModel={
异步findOne(opts){
返回“真实供应商文件”;
},
};
index.test.ts

import{Strategy as JWTStrategy,ExtractJwt,VerifyCallback,StrategyOptions}来自“passport jwt”;
从“护照”进口护照;
从“./models”导入{userModel,vendorModel};
mock('passport-jwt',()=>{
const mJWTStrategy=jest.fn();
常数mExtractJwt={
fromAuthheaderasbarerToken:jest.fn(),
};
返回{Strategy:mJWTStrategy,ExtractJwt:mExtractJwt};
});
mock('passport',()=>{
返回{use:jest.fn()};
});
描述('62125872',()=>{
让verifyRef;
在每个之前(()=>{
const mJwtFromRequestFunction=jest.fn();
(将JWT.FROMAUTHHEADERASBEARTER提取为jest.MockedFunction<
ExtractJwt.fromAuthHeaderAsberToken的类型
>).mockReturnValueOnce(mJwtFromRequestFunction);
(JWTStrategy作为jest.MockedClass).mockImplementation((opt:StrategyOptions,verify:VerifyCallback)=>{
verifyRef=验证;
});
});
它('如果用户文档存在,则应使用用户模型验证并使用jwtpayload完成调用',async()=>{
常量有效负载={type:'User',id:1};
const mDone=jest.fn();
spyOn(userModel,'findOne').mockResolvedValueOnce('mocked user document');
等待导入('./');
等待verifyRef(有效载荷,mDone);
expect(passport.use).toBeCalledWith(expect.any(Object));
期望(JWTStrategy)。使用(
{jwtFromRequest:expect.any(函数),secretroKey:'secret123'},
expect.any(函数),
);
期望(从AuthHeaderAbarerToken.提取JWT.toBeCalledTimes(1);
expect(userModel.findOne).toBeCalledWith({u id:1});
expect(mDone).toBeCalledWith(null,{type:'User',id:1});
});
它(“如果用户文档不存在,则应使用用户模型进行验证并使用false完成调用”),async()=>{
常量有效负载={type:'User',id:1};
const mDone=jest.fn();
jest.spyOn(userModel,'findOne').mockResolvedValueOnce(“”);
等待导入('./');
等待verifyRef(有效载荷,mDone);
expect(passport.use).toBeCalledWith(expect.any(Object));
期望(JWTStrategy)。使用(
{jwtFromRequest:expect.any(函数),secretroKey:'secret123'},
expect.any(函数),
);
期望(从AuthHeaderAbarerToken.提取JWT.toBeCalledTimes(1);
expect(userModel.findOne).toBeCalledWith({u id:1});
expect(mDone).toBeCalledWith(null,false);
});
//你可以做剩下的部分
});
单元测试结果:

PASS stackoverflow/62125872/index.test.ts
62125872
✓ 如果存在用户文档(11ms),则应使用用户模型和jwtpayload完成的调用进行验证
✓ 如果用户文档不存在,则应使用用户模型进行验证,并使用false完成调用(2ms)
-----------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
-----------|---------|----------|---------|---------|-------------------
所有文件| 85 | 83.33 | 60 | 84.21 |
指数.ts | 92.86 | 75 | 100 | 92.31 | 24
模型.ts | 66.67 | 100 | 33.33 | 66.67 | 6,11
-----------|---------|----------|---------|---------|-------------------
测试套件:1个通过,共1个
测试:2次通过,共2次
快照:共0个
时间:3.716秒,估计10秒
单元测试解决方案:

index.ts

从“passport”导入passport;
从“passport jwt”导入{策略作为JWTStrategy,提取jwt};
从“/models”导入{userModel,vendorModel,EntityType};
const JWT_PRIVATE_KEY='secret 123';
passport.use(
新JWT战略(
{
jwtFromRequest:ExtractJwt.FromAuthHeaderAsberToken(),
秘钥:JWT_私钥,
},
异步(jwtPayload:any,done:any)=>{
console.log('123123');
const isUser=jwtPayload.type==EntityType.User;
const model=isUser?userModel:vendorModel;
试一试{
const document=wait model.findOne({u id:jwtPayload.id});
如果(文件){
返回完成(空,jwtPayload);
}否则{
返回完成(null,false);
}
}捕捉(错误){
返回完成(错误、错误);
}
},
),
);
models.ts

导出枚举EntityType{
用户='User',
}
导出常量用户模型={
异步findOne(opts){
返回“真实用户文档”;
},
};
导出常量vendorModel={
异步findOne(opts){
返回“真实供应商文件”;
},
};
index.test.ts

import{Strategy as JWTStrategy,ExtractJwt,VerifyCallback,StrategyOptions}来自“passport jwt”;
进口护照