Angular 16测试卫士DI功能

问题描述 投票:0回答:1

我有一个警卫测试用户是否登录并检查他的用户上下文

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 测试用户未登录时的情况

angular function unit-testing karma-jasmine guard
1个回答
0
投票

你的守卫是异步的,它有效地返回一个

Promise<boolean
>,而不是一个承诺。

此外,您应该返回

UrlTree
而不是导航 + 返回
false
:

return router.createUrlTree(['/authentification']);
© www.soinside.com 2019 - 2024. All rights reserved.