Почему мой модульный тест в Жасмине в Angular 'Router.navigate' работает иначе, когда я использую Маршрутизатор из TestBed? - PullRequest
0 голосов
/ 08 апреля 2019

Я новичок в Жасмин и очень плохо знаком с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...