Модульный тест Angular: Неперехваченная ошибка: неперехваченный (в обещании): Ошибка: не удается сопоставить какие-либо маршруты. Сегмент URL: ‘выход из системы’

#javascript #angular #unit-testing #mocking #karma-jasmine

#javascript #angular #модульное тестирование #издевательство #karma-jasmine

Вопрос:

Я всегда получаю эту ошибку случайным образом для разных тестов, когда я включаю тесты login.spec.ts. Неперехваченная ошибка: неперехваченный (в обещании): Ошибка: не удается сопоставить какие-либо маршруты. Сегмент URL: ‘выход из системы’

Я попытался подделать метод выхода из системы в AuthService, используя: spyOn(AuthService, ‘logout’).и.ReturnValues(true); Но все равно это не работает. Пожалуйста, помогите разобраться с проблемой здесь.

login.component.ts

 export class LoginComponent implements OnInit {

  isLoggingIn = false;
  constructor(
    private authService: AuthService
  ) { }

  ngOnInit() {
    this.authService.logout();
  }
}
  

AuthService.ts

 @Injectable()
export class AuthService {

  public userSource: BehaviorSubject<string | undefined> = new BehaviorSubject<string | undefined>(undefined);

  constructor(
    private myRoute: Router) {
    }
  logout() { // TODO: Right now this is fake logout. We need to either destroy express session or cookie.
    this.userSource.next(undefined);
    this.myRoute.navigate(['logout']);
  }
}
  

и теперь мой

login.component.spec.ts

 describe('LoginComponent', () => {
  let component: LoginComponent;
  let fixture: ComponentFixture<LoginComponent>;
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ LoginComponent ],
      providers: [ AuthService,
        ConfigService
      ],
      imports: [ RouterTestingModule,
      HttpClientTestingModule ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(LoginComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});
  

Комментарии:

1. можете ли вы пометить ответ как правильный, если он работает?

Ответ №1:

У вас ошибка, потому что вы не настроили маршруты, которые даже вы использовали RouterTestingModule здесь. Настройте свой imports раздел спецификации следующим образом, но я не думаю, что вызов logout функции в onInit является правильной реализацией.

 imports: [
   RouterTestingModule.withRoutes([
          { path: 'logout', component: LogoutComponent }
   ]),
   HttpClientTestingModule
]
  

Скажите мне, работает ли это, и мы разберемся с этим. Я думаю, что даже если это решит вашу проблему, это вряд ли проверит ваш тестовый пример.

Комментарии:

1. Я получаю точно такое же поведение, как описано здесь, но мой тест не использует RouterTestingModule , как и тестируемый код. Я продолжу копать, чтобы найти, откуда берется эта зависимость от маршрутизатора.

2. @Simon Пожалуйста, поделитесь кодом, я буду рад помочь

3. спасибо за предложение. В настоящее время я даже не знаю, каким кодом поделиться. Поскольку ошибка теста появляется случайным образом, кажется, что любой тест может завершиться неудачей, даже если ни один из сбоев до сих пор не имел ничего общего с маршрутизацией. Я опубликую снова, как только узнаю больше

4. Разобрался с моей проблемой: компонент MyVerify выполняет проверки ngOnInit через службу, observable.subscribe затем перенаправляет на / public / login. В соответствующей спецификации.ts отсутствовал этот маршрут в RouterTestingModule . Сложность заключается в том, что поскольку наблюдаемая подписка (с отсутствующим маршрутом) выполнялась после завершения теста , сбой был отнесен к следующей спецификации.ts

5. Я вижу, в этом случае вы могли бы использовать задержку (например, tick ) или whenstable с fakeasync , чтобы учесть это. 🙂 Приветствия!!