У меня есть защита, которая запрещает любому пользователю использовать приложение без входа в систему.
Защита находится в своем собственном модуле и отделена от моего приложения. Таким образом, я не хочу проверять саму охрану, а скорее, что она используется. Чтобы уточнить: я хочу, чтобы тест не прошел, если кто-то по ошибке удалил строку canActivate: [MyGuard],
из маршрутизатора и передал иначе.
Я предполагал, что способ сделать это - шпионить за методом canActivate
охранник, а затем вставьте этот охранник в маршрутизатор.
Однако я не смог сделать это успешно, и каждый результат, который я нашел в результате поиска, сосредоточен на тестировании самого охранника.
Это то, что яесть, что, конечно, дает сбой, потому что маршрутизатор вообще никогда не используется:
// app.routing.ts
const routes: Routes = [
{
path: '',
canActivate: [IsAuthenticatedGuard], // this is what I want to make sure is present
children: [{ path: '', pathMatch: 'full', component: HomeComponent }],
},
];
// myspec.spec.ts
describe('AppComponent', () => {
let component: AppComponent;
let fixture: ComponentFixture<AppComponent>;
let canActivateSpy: jasmine.Spy;
let isAuthenticatedGuard: IsAuthenticatedGuard;
beforeAll(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule,
..., // a bunch of other imports that aren't relevant to that question
],
declarations: [AppComponent],
});
fixture = TestBed.createComponent(AppComponent);
isAuthenticatedGuard = fixture.debugElement.injector.get(
IsAuthenticatedGuard,
);
canActivateSpy = spyOn(isAuthenticatedGuard, 'canActivate');
fixture.detectChanges();
component = fixture.componentInstance;
}));
it('should have a guard', () => {
expect(canActivateSpy.calls.any()).toBe(true);
});
Как бы я протестировал это с Angular 8?