Как правильно инициализировать состояния Angular UI-Router в модульных тестах?

#angular #unit-testing #angular-ui-router

#angular #модульное тестирование #angular-ui-router

Вопрос:

У нас есть гибридное приложение AngularJS / Angular 11, которое использует UI-Router для своей маршрутизации (с помощью angular-hybrid). Я работаю над компонентом Angular (11), который должен проверять текущее состояние маршрутизатора и всех его предков. В частности, ему необходимо прочитать значения параметров этих состояний.

Вот упрощенный пример того, что делает компонент:

 @Component(...)
export class MyComponent {

  constructor(private uiRouterGlobals: UIRouterGlobals) {}

  parseStates(): void {
    let state = this.uiRouterGlobals.$current;
    while (!!state) {
      if (!state.abstract amp;amp; !!state.params?.someParam) {
        const paramValue = state.params.someParam.value();
        // Handle the value
      }
      state = state.parent;
    }
  }
 

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

 beforeEach(waitForAsync(() => {
  TestBed.configureTestingModule({
    declarations: [MyComponent],
    imports: [
      UIRouterModule.forRoot({
          {
            name: 'app',
            params: { someParam: 'some value' },
          },
          {
            name: 'app.state1',
            params: { someOtherParam: 'some other value' },
          },
        ],
      }),
    ],
  }).compileComponents();
}));
 

Во время тестов после перехода в состояние app.state1 и выполнения parseStates() функции появляется следующая ошибка:

TypeError: someParam.value is not a function

После небольшой отладки теста я заметил, что значения в params объектах, определенных в тестовых состояниях, по-прежнему являются строками. При запуске реального приложения эти значения преобразуются в Param объекты, которые имеют value() функцию, которая MyComponent использует. AFAIK это преобразование происходит во время начальной загрузки приложения. Может быть, этот процесс отличается во время модульных тестов? Есть ли способ правильно инициализировать UI-Router StateObjects в реестре во время модульных тестов?