Ionic 4 Storage удалить - PullRequest
       38

Ionic 4 Storage удалить

0 голосов
/ 08 октября 2019

В моем приложении Ionic есть хранилище токена учетных данных, и для выполнения действия по выходу из системы необходимо удалить токен, хранящийся в нем. Вот мой LoginService:

// imports skipped;

export class LoginService implements CanActivate {
    private authToken: string;
    private httpService: string;

    constructor(
        private handler: HttpBackend,
        private router: Router,
        private storage: Storage
    ) {
        this.httpService = new HttpClient(handler);
    }

    private generateToken(login: string, password: string) {
        return btoa(`${login}:${password}`);
    }

    authenticate(login: string, password: string, webserviceURL: string) {
        const httpOptions = {
            headers: new HttpHeaders({
                'Content-Type': 'application/json',
                Authorization: `Basic ${this.generateToken(login, password)}`
            })
        };
        return this.httpClient.get(`http://${webserviceURL}/api/version/`, httpOptions);
    }

    async saveToken(login: string, password: string) {
        this.authToken = this.generateToken(login, password);
        return await this.storage.set('AUTH_TOKEN', this.authToken);
    }

    async getToken() {
        return await this.storage.get('AUTH_TOKEN');
    }

    async clearData() {
        this.authToken = null;
        return await this.storage.remove('AUTH_TOKEN');
    }

    canActivate() {
        if (this.authToken) {
            return true;
        }
        this.router.navigateByUrl('login');
    }
}

, и в моем тесте для этой службы я получил следующее:

        const expectedToken = btoa('testLogin:testPassword');

        service.saveToken('testLogin', 'testPassword').then(() => {
            service.getToken().then(savedToken => {
                expect(savedToken).toEqual(expectedToken);
            });
        });

        service.clearData().then(() => {
            service.getToken().then(savedToken => {
                expect(savedToken).toBe(null);
            });
        });

Так что каждый раз, когда я запускаю свой тест, последний тестовый случай терпит неудачу, потому что по какой-то причине токен не удаляется из хранилища. Вот тестовый вывод: Error: Expected 'dGVzdExvZ2luOnRlc3RQYXNzd29yZA==' to be null. Как правильно обрабатывать удаление значения из хранилища?

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Сам не пробовал, но я ожидал, что сработает что-то вроде следующего:

this.storage.set('AUTH_TOKEN', null);

или

// Actually use a variation of this one myself for one case
this.storage.set('AUTH_TOKEN', '');

Редактировать: Обаиз них, если вам нужно хранить ключи в локальном хранилище. Т.е. ваше приложение ожидает, что ключ существует всегда - независимо от состояния.

0 голосов
/ 08 октября 2019

2-я попытка ... если ваш код выполняется в одном методе, то он должен быть вложенным, или он будет запускаться один за другим?

    const expectedToken = btoa('testLogin:testPassword');

    service.saveToken('testLogin', 'testPassword').then(() => {
        service.getToken().then(savedToken => {
            expect(savedToken).toEqual(expectedToken);

            service.clearData().then(() => {
                service.getToken().then(savedToken => {
                    expect(savedToken).toBe(null);
                });
            });
        });
    });
...