Проверка углового перенаправления аутентификации - PullRequest
0 голосов
/ 27 марта 2019

У меня есть угловой authenticated охранник

@Injectable({
    providedIn: 'root'
})
export class AuthenticatedGuard implements CanActivate, CanActivateChild {
    constructor(@Inject('Window') private window: Window,
                private readonly authenticationService: AuthenticationService) {}

    canActivate(): boolean {
        if (!this.authenticationService.isAuthenticated) {
            this.window.location.href = '/login';
        }
        return allowed;
    }

    canActivateChild(): boolean {
        return this.canActivate();
    }
}

И у меня есть эти тесты с фиктивным окном, которое я делаю инъекцией, чтобы мое тестовое окно не перенаправляло, и поэтому я могу проверить, неhref установлено

const MockWindow = {
    location: {
        _href: '',
        set href(url: string) {
            //console.log('set!', url)
            this._href = url;
        },
        get href(): string {
            //console.log('get!', this._href)
            return this._href;
        }
    }
};

describe('Guard: authenticated', () => {
    let redirectSpy: jasmine.Spy;

    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [
                AuthenticatedGuard,
                AuthenticationService,
                {provide: 'Window', useValue: MockWindow}
            ]
        });
        redirectSpy = spyOnProperty(MockWindow.location, 'href', 'set');
    });

    afterEach(() => {
        sessionStorage.removeItem('token');
    });

    it('should allow route activation when both the token is set', inject([AuthenticatedGuard], (guard: AuthenticatedGuard) => {
        sessionStorage.setItem('token', 'foo');
        expect(guard.canActivate()).toEqual(true);
        expect(guard.canActivateChild()).toEqual(true);
        expect(redirectSpy).not.toHaveBeenCalled();
    }));

    it('should disallow route activation when the token is not set', inject([AuthenticatedGuard], (guard: AuthenticatedGuard) => {
        expect(guard.canActivate()).toEqual(false);
        expect(guard.canActivateChild()).toEqual(false);
        expect(redirectSpy).toHaveBeenCalledWith('/login'); //<-- this fails!
    }));

...

expect(redirectSpy).toHaveBeenCalledWith('/login'); всегда терпит неудачу, говоря, что он никогда не вызывался вообще.То же самое с expect(redirectSpy).toHaveBeenCalled(); - Что я здесь не так делаю?Я хочу иметь возможность проверить это перенаправление, но я не хочу, чтобы мой браузер тестирования кармы фактически перенаправлял.

(К вашему сведению: мне нужно использовать window.location.href вместо углового маршрутизатора, чтобы мы могли направлять пользователейв другое неугловое приложение, которое обрабатывает логин)

1 Ответ

0 голосов
/ 27 марта 2019

Я нашел что-то, что работает, что устраняет необходимость в шпионе. теперь я просто get провайдер введенного окна от охранника, позвонив TestBed.get('Window'), который, кажется, прекрасно работает!

Пожалуйста, дайте мне знать, если это можно сделать лучше!

const MockWindow = {
    location: {
        href: '',
    }
};

describe('Guard: authenticated', () => {
    let guard: AuthenticatedGuard;
    let guardWindow: Window;

    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [
                AuthenticatedGuard,
                AuthenticationService,
                {provide: 'Window', useValue: MockWindow}
            ]
        });
        guardWindow = TestBed.get('Window');
        MockWindow.location.href = '/some/page';
    });

    afterEach(() => {
        sessionStorage.removeItem('token');
    });

    it('should allow route activation when the token is set', () => {
        sessionStorage.setItem('token', 'foo');
        expect(guard.canActivate()).toEqual(true);
        expect(guard.canActivateChild()).toEqual(true);
        expect(guardWindow.location.href).toEqual('/some/page');
    });

    it('should disallow route activation when the token is not set', () => {
        sessionStorage.setItem('token', 'foo');
        expect(guard.canActivate()).toEqual(false);
        expect(guard.canActivateChild()).toEqual(false);
        expect(guardWindow.location.href).toEqual('/login');
    });
...
...