我在 Nest 中使用 Jest。
我有以下控制器,其中包含两个使用 firebase/auth
方法的简单路由:
@Controller('login')
export class LoginController {
constructor(private firebaseWebService: FirebaseWebService){}
//Login route: JWT token if everything is fine.
@Post()
async getJWT(@Res() res: Response, @Body() login: Login) {
try{
this.firebaseWebService.firebaseWebApp.auth().signInWithEmailAndPassword(login.username, login.password)
.then(async (userCredential) => {
// Signed in
var user = userCredential.user;
if (!user.emailVerified) {
Helpers.responseWrapper('/login', res, 401, "Email not verified." );
return;
}
let JWTtoken = await user.getIdToken(true);
Helpers.responseWrapper('/login', res, 200, {"jwt" : JWTtoken} );
})
.catch((error) => {
Helpers.responseWrapper('/login', res, 400, error.message );
});
}catch(err){
console.log(err);
}
//Helpers.responseWrapper('/login', res, 200, {} );
}
//Route to reset password
@Post('reset')
async resetPassword(@Res() res: Response, @Body('username') username: string) {
try {
this.firebaseWebService.firebaseWebApp.auth().sendPasswordResetEmail(username)
.then(() => {
// Password sent!
Helpers.responseWrapper('/reset', res, 200, "An email to reset password has been sent." )
})
.catch((error) => {
Helpers.responseWrapper('/reset', res, 400, error.message);
});
}catch(err){
console.error(err);
}
}
}
我对软件测试一窍不通,我无法理解在这种情况下如何模拟 signInWithEmailAndPassword
和 sendPasswordResetEmail
。
这是我开发的通过 configService
服务处理 firebase 连接的服务:
@Injectable()
export class FirebaseWebService {
public firebaseWebApp: any;
constructor(private configService: ConfigService) {
const firebase_conf = {
apiKey: this.configService.get<string>('FIREBASEWEB_API_KEY'),
authDomain: this.configService.get<string>('FIREBASEWEB_AUTH_DOMAIN'),
databaseURL: this.configService.get<string>('FIREBASEWEB_DATABASE_URL'),
projectId: this.configService.get<string>('FIREBASEWEB_PROJECT_ID'),
storageBucket: this.configService.get<string>('FIREBASEWEB_STORAGE_BUCKET'),
messagingSenderId: this.configService.get<string>('FIREBASEWEB_MESSAGING_SENDER_ID'),
appId: this.configService.get<string>('FIREBASEWEB_APP_ID')
}
if (!firebase.apps.length) {
this.firebaseWebApp = firebase.initializeApp(firebase_conf);
}else{
this.firebaseWebApp = firebase.app();
}
}
}