在解析路径之前测试令牌的示例解析器:
@Injectable({
providedIn: 'root'
})
export class JwtResolverService implements Resolve<string> {
constructor(private authService: AuthService) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<string> {
return this.authService.getToken()
.pipe(
tap(value => log.debug(`============= Resolving token: ${value} =============`)),
catchError(err => of(null))
);
}
}
测试:
import { TestBed } from '@angular/core/testing';
import { JwtResolverService } from './jwt-resolver.service';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { Observable, of } from 'rxjs';
import { AuthService } from '../../auth/auth.service';
import { ActivatedRouteSnapshot } from '@angular/router';
class MockAuthService {
token = '1234';
getToken(): Observable<string> {
return of(this.token);
}
}
describe('JWT ResolverService', () => {
let resolver: JwtResolverService;
let authService: AuthService;
let route: ActivatedRouteSnapshot;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule
],
providers: [
{ provide: AuthService, useClass: MockAuthService },
]
});
route = new ActivatedRouteSnapshot();
authService = TestBed.inject(AuthService);
resolver = TestBed.inject(JwtResolverService);
});
it('should be created', () => {
expect(resolver).toBeTruthy();
});
it('should resolve when token is available', () => {
// arrange
// act
resolver.resolve(route, null).subscribe(resolved => {
// assert
expect(resolved).toBeTruthy();
});
})
it('should not resolve when token is not available', () => {
// arrange
spyOn(authService, 'getToken').and.returnValue(of(null));
// act
resolver.resolve(route, null).subscribe(resolved => {
// assert
expect(resolved).toBeFalsy();
});
})
it('should not resolve on error', () => {
// arrange
spyOn(authService, 'getSVBToken').and.returnValue(throwError({status: 404}));
// act
resolver.resolve(route, null).subscribe(resolved => {
// assert
expect(resolved).toBeFalsy();
});
})
});