使用 Jest 测试 Nest 控制器

时间:2021-05-05 13:17:57

标签: firebase-authentication jestjs mocking nestjs

我在 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);
    }
   
  }
}

我对软件测试一窍不通,我无法理解在这种情况下如何模拟 signInWithEmailAndPasswordsendPasswordResetEmail

这是我开发的通过 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();
        }
    }    
}

0 个答案:

没有答案