Как проверить наличие маршрута с отложенной загрузкой в ​​Angular? - PullRequest
1 голос
/ 19 июня 2020

Мой вопрос похож на этот вопрос . Пытаюсь написать тест, проверяющий наличие маршрута в Angular. Основное отличие связанного вопроса в том, что я использую модули отложенной загрузки вместо компонентов.

У меня есть файл app.routes.ts , содержащий маршруты:

import { Routes } from '@angular/router';

export const routes: Routes = [
    {
        path: '',
        loadChildren: () => import('./main/main.module').then(m => m.MainModule)
    }
];

В тестовом файле app.routes.spe c .ts , я ожидаю, что этот маршрут существует:

import { routes } from './app.routes';

describe('app.routes', () => {
    it('should contain a route for /', () => {
        expect(routes).toContain({
            path: '',
            loadChildren: () => import('./main/main.module').then(m => m.MainModule)
        });
    });
});

Когда я запускаю это, тест не проходит.

Ожидается, что [Object ({path: '', loadChildren: Function})] будет содержать Object ({path: '', loadChildren: Function}). Ошибка: ожидалось, что [Object ({path: '', loadChildren: Function})] будет содержать объект ({path: '', loadChildren: Function}). в в UserContext. (http://localhost: 9876 / _karma_webpack_ / src / app / app.routes.spe c .ts: 5: 24 ) в ZoneDelegate.invoke (http://localhost: 9876 / _karma_webpack_ / node_modules / zone.js / dist / zone-evergreen. js: 365: 1 ) в ProxyZoneSpe c .onInvoke (http://localhost: 9876 / _karma_webpack_ / node_modules / zone.js / dist / zone-testing. js: 305: 1 )

Как я могу исправить этот модульный тест и убедиться, что существование ленивых загружаемых маршрутов можно проверить? Спасибо!

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я знаю, что некоторые люди не думают, что это должно быть частью модульного тестирования, и что маршрутизация должна быть проверена при тестировании e2e. Лично мне нравится идея проверить, все ли мои маршруты существуют, и нет ли опечаток. Мысль о том, что если кто-то закомментирует маршрут по какой-либо причине и забудет отменить его, а автоматическое тестирование поймает это, я чувствую себя немного в большей безопасности.

Ответы [ 2 ]

0 голосов
/ 24 июня 2020

Я нашел общее c решение моей проблемы по тестированию ленивых загружаемых маршрутов, основанное на ответе Aaka sh Garg. Я делюсь своим решением, если оно может помочь кому-то с той же проблемой. Это решение работает для меня, но я не утверждаю, что это идеальный способ сделать это.

По сути, я добавил настраиваемый сопоставитель для жасмина, чтобы проверить равенство маршрутов.

файл исходного кода equal-route-matcher.ts :

import MatchersUtil = jasmine.MatchersUtil;
import CustomMatcherFactories = jasmine.CustomMatcherFactories;
import CustomEqualityTester = jasmine.CustomEqualityTester;
import CustomMatcher = jasmine.CustomMatcher;
import CustomMatcherResult = jasmine.CustomMatcherResult;

function replacer(key: any, value: any) {
    if (typeof value === 'function') {
        value = value.toString();
    }
    return value;
  }

export const EqualRouteMatcher: CustomMatcherFactories = {
    toEqualRoute: (util: MatchersUtil, customEqualityTester: CustomEqualityTester[]): CustomMatcher => {
        return {
            compare: (actual: any, expected: any): CustomMatcherResult => {
                let actualstring: string, expectedstring: string;
                actualstring = JSON.stringify(actual, replacer).replace(/(\\t|\\n)/g,'');
                expectedstring = JSON.stringify(expected, replacer).replace(/(\\t|\\n)/g,'');
                if (actualstring === expectedstring) {
                    return {
                        pass: true,
                        message: 'Routes are equal'
                    };
                } else {
                    return {
                        pass: false,
                        message: 'Expected route ' + actualstring + ' to equal route ' + expectedstring
                    };
                }
            }
        };
    }
};

Файл определения типа equal-route-matcher-type.d.ts :

declare namespace jasmine {
    interface Matchers<T> {
        toEqualRoute(expected: any, expectationFailOutput?: any): boolean;
    }
}

Наконец, вы можете импортировать настраиваемый сопоставитель в файл модульного теста и использовать его следующим образом:

import { routes } from './app.routes';
import { EqualRouteMatcher } from './equal-route-matcher.ts';

describe('app.routes', () => {
    beforeEach(() => {
        jasmine.addMatchers(EqualRouteMatcher);
    });

    it('should contain a route for /', () => {
      expect(routes.length).toEqual(1);
      expect(routes[0]).toEqualRoute({path: '',loadChildren: () => import('./main/main.module').then(m => m.MainModule)});
    });
});
0 голосов
/ 19 июня 2020

Проверить это как: -

    expect(routes.find((route) => JSON.stringify(route,function(key, value) {
  if (typeof value === "function") {
    return "/Function(" + value.toString() + ")/";
  }
  return value;
}) === JSON.stringify({"path":"","loadChildren":"/Function(() => import('./main/main.module').then(m => m.MainModule))/"}))).toBeTruthy();

Скриншот работы: -

введите описание изображения здесь

...