Я новичок в Жасмин и очень плохо знаком с Angular (в нашем случае 7).
Я проверяю функцию canActivate
моего AuthGuard, которая в этом случае возвращает Observable<boolean>
.
какчасть функции canActivate
, если пользователь не вошел в систему, они должны быть перенаправлены на страницу \login
.
В моем тестовом классе, если я создаю (n) (угловой) шпион маршрутизаторавнутри функции beforeEach
и присвойте ее переменной SpyObj<Router>
, вызвав TestBed.get(Router)
, например:
describe('AuthGuard', () => {
let routeSpy: jasmine.SpyObj<Router>;
...
beforeEach(() => {
...
const routerSpy = jasmine.createSpyObj('Router', ['navigate']);
TestBed.configureTestingModule({
providers: [
{ provide: Router, useValue: routerSpy},
...
]
});
routeSpy = TestBed.get(Router);
});
...
});
при I expect(routeSpy.navigate).toHaveBeenCalledWith('\login')
, тест не пройден , если IВызовите .subscribe()
для функции canActivate
моего AuthGuard внутри теста.
Запутанная часть (и, следовательно, основа для моего вопроса) заключается в том, что я не нуждаюсь вызвать .subscribe()
, чтобы пройти тестовый тест, если я не использую шпиона маршрута из TestBed, и вместо этого создать шпиона вне функции beforeEach()
:
describe('AuthGuard', () => {
const routeSpy = jasmine.createSpyObj('Router', ['navigate']);
...
beforeEach(() => {
...
TestBed.configureTestingModule({
providers: [
{ provide: Router, useValue: routeSpy },
...
]
});
...
});
Любые идеи какпочему есть такая разница?
Вот тест под вопросом (в состоянии требования .subscribe()
):
it('should route to login page when not activated', () => {
const expectedRoute = '/login';
userServiceSpy.isUserLoggedIn.and.returnValue( of(false) );
authguard.canActivate(null, null).subscribe();
expect(routeSpy.navigate).toHaveBeenCalledWith([expectedRoute]);
});
Соответствующий код можно найти в этом коде StackBlitz , в пути \src\app\auth\
:
auth.guard.spec.ts
auth.guard.ts
user-service.ts
Не уверен, если это необходимо для этого вопроса, но я включил урезанную версию UserService