【发布时间】:2019-08-16 09:03:56
【问题描述】:
我想测试使用其他方法 jwt_decode 的 getTokenExpirationDate() 方法,它是从 jwt-decode 导入的。我怎样才能对这种方法进行单元测试?如何模拟这个 jwt_decode 方法。
import { Injectable } from '@angular/core';
import {CanActivate, Router} from '@angular/router';
import * as jwt_decode from 'jwt-decode';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private router: Router) { }
canActivate(): boolean {
const token = localStorage.getItem(('loginToken'));
if (this.isTokenExpired(token)) {
localStorage.removeItem('loginToken');
this.router.navigate(['/login']);
return false;
} else {
return true;
}
}
isTokenExpired(token: string): boolean {
if (!token) { return true;
} else {
const date = this.getTokenExpirationDate(token);
if (date === undefined) {
return false;
} else {
return !(date.valueOf() > new Date().valueOf());
}
}
}
getTokenExpirationDate(token: string): Date {
const decoded = jwt_decode(token);
if (decoded.exp === undefined) {
return null;
} else {
const date = new Date(0);
date.setUTCSeconds(decoded.exp);
return date;
}
}
}
【问题讨论】:
-
我不会试图嘲笑它。我只需传递一个有效的 jwt 令牌,该函数可以解码。
-
另外关于您更新的问题:我宁愿避免在您的方法中调用
new Date().valueOf()。因为它的值会根据您的当地时间而改变。 Rahter,在构造函数或方法中注入当前时间作为now值。然后,您可以创建始终表现相同的测试用例。 (您必须在某些时候将代码粘合到实际注入当前时间的位置,但这应该只是一个启动脚本。在测试中,您可以使用模拟时间。)
标签: angular unit-testing karma-jasmine