Как провести модульный тест canActivate of Angular? - PullRequest
0 голосов
/ 21 декабря 2018

Как я могу проверить canActivate функцию angular, которая возвращает функцию, которая в свою очередь возвращает значение boolean?.

Я попытался создать объекты ActivatedrouterSnapshot и routerStateSnapshot и передать ихcanActivate, но это не помогло.

export class AuthGuard implements CanActivate {
constructor(
private authService: AuthenticationService,
private loginService: LoginService,
private router: Router
) {}

canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> 
| boolean {
return this.checkLogin(state.url);
}

checkLogin(url: string): boolean {
    if (this.authService.isLoggedIn()) {  return true; }

// Store the attempted URL for redirecting
this.loginService.redirectUrl = url;

// Navigate to the login page with extras
this.router.navigate(['/login']);
return false;
 }
}

Поскольку checklogin возвращает true, я хочу, чтобы это произошло.Но я не знаю, с чего начать?

1 Ответ

0 голосов
/ 21 декабря 2018

Есть много способов сделать это.Я хотел бы предложить что-то вроде следующего.Просто чтобы показать разнообразие, я издевался над одним сервисом с классом, а другой - с spyObject.

Вот код, предложенный ниже:

class LoginMock implements Partial<LoginService> {
    redirectUrl: string;
}

describe('AuthGuard', () => {

    let authGuard: AuthGuard;
    let loginService: LoginMock;
    const routerMock = jasmine.createSpyObj('Router', ['navigate']);
    const authMock = jasmine.createSpyObj('AuthenticationService', ['isLoggedIn']);

    beforeEach(() => {
        loginService = new LoginMock();
        authGuard = new AuthGuard(authMock, loginService, routerMock);
    });

    it('should be createable', () => expect(authGuard).toBeTruthy());

    it('should return true for canActivate() and not set loginService.redirectUrl when isLoggedIn === true', ()=> {
        authMock.isLoggedIn.and.returnValue(true);
        const result = authGuard.canActivate(new ActivatedRouteSnapshot(), <RouterStateSnapshot>{url: 'testUrl'});
        expect(result).toBe(true);
        expect(loginService.redirectUrl).toBeUndefined();
    });

    it('should return false for canActivate() and set loginService.redirectUrl when isLoggedIn === false', ()=> {
        authMock.isLoggedIn.and.returnValue(false);
        const result = authGuard.canActivate(new ActivatedRouteSnapshot(), <RouterStateSnapshot>{url: 'testUrl'});
        expect(result).toBe(false);
        expect(loginService.redirectUrl).toEqual('testUrl');
    });

});

Я собрал это в Stackblitz для вас.Не стесняйтесь втиснуть это в свою собственную среду Stackblitz и изменить.

Удачи.:)

...