Как протестировать угловые охранники/преобразователи без издевательства над ActivatedRouteSnapshot

Я пытаюсь протестировать Angular Resolver, который получает доступ к дочерним маршрутам param.

Моя защита работает нормально, но я не могу легко создать модульный тест, потому что я не могу создать ActivatedRouteSnapshot с дочерними маршрутами (свойство только для чтения).

Мой преобразователь

@Injectable({
    providedIn: 'root'
})
export class MyResolverGuard implements Resolve<string> {

    constructor() {
    }

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): string {
        return route.firstChild.paramMap.get('my-param');
    }
}

Мой тест:

    it('should resolve chilren route params', () => {
        guard = TestBed.get(MyResolverGuard);
        const route = new ActivatedRouteSnapshot();
        // Cannot assign children because it's a read only property
        route.children = [...];
        const myResolverParams = guard.resolve(route, null);
    });

Есть ли другие способы, кроме использования макета ActivatedRouteSnapshot?

Хорош ли мой подход к тестовой защите?

Спасибо, что поделились своей стратегией.


person Martin Choraine    schedule 19.07.2019    source источник
comment
Не могли бы вы объяснить, почему вы хотите проверить охрану, не издеваясь над ActivatedRouteSnapshot?   -  person Erbsenkoenig    schedule 05.08.2019
comment
Это потому, что я не хочу обходить логику внутри ActivatedRouteSnapshot. Например, маршруты children будут устанавливать свойство firstChild. Мой подход может быть неправильным, я просто хотел найти альтернативу, чем насмешки.   -  person Martin Choraine    schedule 05.08.2019
comment
Имхо, возможно, было бы лучше протестировать это внутри интеграционного теста, а не модульного теста.   -  person Erbsenkoenig    schedule 05.08.2019
comment
Если вам нужен заполненный объект ActivatedRouteSnapshot, я думаю, вам также нужно будет смоделировать свои маршруты (с помощью Guard) и выполнить router.navigate(). Как вы заметили, имитируя объект ActivatedRouteSnapshot, вы не можете манипулировать свойствами, доступными только для чтения. ActivatedRouteSnapshot представляет снимок/состояние объекта ActivatedRoute в момент времени.   -  person terahertz    schedule 05.08.2019
comment
Выполнение router.navigate() для фиктивного маршрута в RouterTestModule, который также определен с помощью Guard, позволит внедренному ActivatedrouteSnapshot Guard иметь различные свойства только для чтения (например, firstChild, Children, pathFromRoot), которые в противном случае были бы нулевыми. в издевательском объекте new ActivatedRouteSnapshot(). Я понятия не имею, как работает ваша защита, поэтому я не могу предоставить примеры кода. Опубликуйте больше примеров кода (например, как выглядят ваши маршруты), если вы думаете, что это поможет людям понять ваш контекст и ответить на ваш вопрос...   -  person terahertz    schedule 05.08.2019