Я пытаюсь создать тест для директивы, которая должна очистить элемент, к которому она прикреплена, если у пользователя нет правильного разрешения на ее просмотр. Я начал с создания фиктивного компонента с прикрепленной директивой. Проблема в том, что я не знаю, как я должен проверять функциональность этого, когда функции являются частными и не принимают параметров. Могу ли я получить некоторую помощь при создании теста для этой директивы?
Вот сама директива, метод checkRoles
просто перебирает разрешения и проверяет другой массив, чтобы увидеть, существует ли разрешение в этом массиве. Если это так, то хорошо, если нет, то скрывает элемент, к которому он прикреплен.
import { Directive, Input, OnInit, ViewContainerRef } from '@angular/core';
import { AppService } from '../services/app-service.service';
@Directive({
selector: '[appHasRole]'
})
export class HasRoleDirective implements OnInit {
@Input() appHasRole: string[];
constructor(
private viewContainer: ViewContainerRef,
private appService: AppService
) { }
ngOnInit() {
if (Array.isArray(this.appHasRole)) {
this.checkRoles();
}
}
private checkRoles() {
this.appHasRole.forEach(role => {
if (!this.appService.hasPermission(role)) {
this.removeFromView();
}
});
}
private removeFromView() {
this.viewContainer.clear();
}
}
и вот файл спецификации. Я начал с создания пользовательских разрешений, а затем того, что им нужно. Честно говоря, я не знаю, куда идти, поскольку функции в этой директиве являются частными.
import { HasRoleDirective } from './has-role.directive';
import { Component, DebugElement } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
@Component({
template: `<div [appHasRole]="TEST_ROLE">Testing hasRoleDirective</div>`
})
class TestHasRoleDirective {}
describe('HasRoleDirective', () => {
let component: TestHasRoleDirective;
let fixture: ComponentFixture<TestHasRoleDirective>;
let element: DebugElement;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [TestHasRoleDirective, HasRoleDirective]
});
fixture = TestBed.createComponent(TestHasRoleDirective);
component = fixture.componentInstance;
element = fixture.debugElement.query(By.css('div'));
});
it('should create an instance', () => {
const directive = HasRoleDirective;
expect(directive).toBeTruthy();
});
it('should hide the element if the user does not have the role', () => {
const userPermissions = ['NOT_TEST_ROLE'];
const neededPermission = ['TEST_ROLE'];
component.appHasRole = neededPermission;
});
});