我有一个警卫测试用户是否登录并检查他的用户上下文
export function authenticationGuard(userContext: UserContextService): CanActivateFn {
return async (_next: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {
const userService: UserService = inject(UserService);
const router: Router = inject(Router);
const cognitoService: CognitoService = inject(CognitoService);
if(await cognitoService.currentAuthenticatedUser()){
if(userContext.getUserInfos() === undefined || userContext.getUserInfos() === null || Object.keys(userContext.getUserInfos()).length === 0){
const userInfo$ = userService.getCurrentUserInfos();
userContext.setUserInfos(await lastValueFrom(userInfo$));
}
return true;
}else{
localStorage.setItem('redirect', JSON.stringify(state.url));
router.navigate(['authentification']);
return false;
}
};
}
我编写单元测试:
describe('authenticationGuard', () => {
let cognitoServiceSpy: jasmine.SpyObj<CognitoService>;
let userContextServiceSpy: jasmine.SpyObj<UserContextService>;
let userServiceSpy: jasmine.SpyObj<UserService>;
let activatedRoute: jasmine.SpyObj<ActivatedRoute>;
let routerState: jasmine.SpyObj<RouterState>;
let mockRouter = {
navigate: jasmine.createSpy('navigate')
};
beforeEach(() => {
cognitoServiceSpy = jasmine.createSpyObj('CognitoService', ['currentAuthenticatedUser']);
userServiceSpy = jasmine.createSpyObj('UserService', ['getCurrentUserInfos']);
userContextServiceSpy = jasmine.createSpyObj('UserContextService', ['getUserInfos', 'setUserInfos']);
activatedRoute = jasmine.createSpyObj('ActivatedRoute', [], {'snapshot': {}});
routerState = jasmine.createSpyObj('RouterState', [], {'snapshot': {}});
TestBed.configureTestingModule({
imports: [RouterTestingModule],
providers: [
{ provide: CognitoService, useValue: cognitoServiceSpy },
{ provide: UserService, useValue: userServiceSpy },
{ provide: UserContextService, useValue: userContextServiceSpy },
{ provide: Router, useValue: mockRouter },
{ provide: ActivatedRoute, useValue: activatedRoute },
{ provide: RouterState, useValue: routerState }
]
});
});
it('should be created', fakeAsync(() => {
cognitoServiceSpy.currentAuthenticatedUser.and.resolveTo(false);
const executeGuard: any = TestBed.runInInjectionContext(() => {
return authenticationGuard(userContextServiceSpy);
});
tick();
expect(mockRouter.navigate).toHaveBeenCalled();
expect(executeGuard).toBeFalse();
}));
});
结果是预期函数为假。
我不明白这个问题。
如何测试我的防守。我想要 abocrd 测试用户未登录时的情况
你的守卫是异步的,它有效地返回一个
Promise<boolean
>,而不是一个承诺。
此外,您应该返回
UrlTree
而不是导航 + 返回 false
:
return router.createUrlTree(['/authentification']);