Tenho uma função ngOnInit() em um componente que verifica o armazenamento de sessão por meio de um StorageService para ver se um usuário está logado e qual é o tipo de conta dele. Ele então atribuirá um bool isAdmin como true se o tipo de conta for 0, ou isGuest true se isLoggedIn() retornar false.
Aqui está o código relevante:
Componente
import { Component, OnInit } from '@angular/core';
import { StorageService } from '../_services/storage.service';
import { AuthService } from '../_services/auth.service';
import { Router } from '@angular/router';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrl: './navbar.component.css'
})
export class NavbarComponent implements OnInit {
isLoggedIn = false;
isAdmin = false;
isGuest = true;
constructor(private authService: AuthService, private storageService: StorageService, private router: Router) { }
ngOnInit(): void {
if (this.storageService.isLoggedIn()) {
this.isLoggedIn = true;
this.isGuest = false;
if (this.storageService.getAccountType() == 0) {
this.isAdmin = true;
}
}
}
logout(): void {
sessionStorage.clear();
this.reloadPage();
}
search(text: string): void {
this.router.navigate(['/library', {search: text}])
}
reloadPage(): void {
window.location.reload();
}
}
Serviço de Armazenamento
import { Injectable } from '@angular/core';
const USER_KEY = 'auth-user';
@Injectable({
providedIn: 'root'
})
export class StorageService {
constructor() { }
clean(): void {
window.sessionStorage.clear();
}
public saveUser(user: any): void {
window.sessionStorage.removeItem(USER_KEY);
window.sessionStorage.setItem(USER_KEY, JSON.stringify(user));
}
public getUser(): any {
const user = window.sessionStorage.getItem(USER_KEY);
if (user) {
return JSON.parse(user);
}
return {};
}
public isLoggedIn(): boolean {
const user = window.sessionStorage.getItem(USER_KEY);
if (user) {
return true;
}
return false;
}
public getAccountType() {
const user = window.sessionStorage.getItem(USER_KEY);
if (user) {
var parsedUser = JSON.parse(user);
return parsedUser.accountType;
}
}
}
Estou com problemas para simular este serviço. Quero simular os valores de retorno dos métodos isLoggedIn() e getAccountType() chamados no componente ngOnInit() para simular um tipo de conta de administrador. Como eu faria isso? Primeira vez tentando testes de unidade com Jasmine.
Minha tentativa atual:
Arquivo de teste de unidade
import { FormsModule } from "@angular/forms";
import { NavbarComponent } from "./navbar.component";
import { ComponentFixture, TestBed } from "@angular/core/testing";
import { provideHttpClient } from "@angular/common/http";
import { StorageService } from "../_services/storage.service";
describe('NavbarComponent', () => {
let component: NavbarComponent;
let fixture: ComponentFixture<NavbarComponent>;
let mockStorageService: jasmine.SpyObj<StorageService>;
beforeEach(async () => {
mockStorageService = jasmine.createSpyObj('StorageService', ['isLoggedIn', 'getAccountType']);
mockStorageService.isLoggedIn.and.returnValue(true);
mockStorageService.getAccountType.and.returnValue(0);
await TestBed.configureTestingModule({
declarations: [NavbarComponent],
imports: [FormsModule],
providers: [{ provide: StorageService, useValue: mockStorageService }]
})
.compileComponents();
fixture = TestBed.createComponent(NavbarComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should set isLoggedIn to true on init', () => {
component.ngOnInit();
expect(component.isLoggedIn).toBe(true);
});
it('should detect admin', () => {
component.ngOnInit();
expect(component.isAdmin).toBe(true);
});
});
Você fez isso corretamente, uma vez que a correção é executar o mocking em
it
bloco ou agrupar os casos de teste por categoria, comoadmin
descrever o bloco, e então usarbeforeEach
para chamar os mocks antes de cada caso de teste.