#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
в реестре во время модульных тестов?