Я тестирую модуль, который используется для редактирования объекта. У объекта есть уникальный объект, id
который используется для получения определенного объекта из массива объектов, размещенных в службе. Специфичность id
обеспечивается параметром, который передается через маршрутизацию, в частности, через ActivatedRoute
класс.
Конструктор выглядит следующим образом:
constructor(private _router:Router, private _curRoute:ActivatedRoute, private _session:Session) {
}
ngOnInit() {
this._curRoute.params.subscribe(params => {
this.userId = params['id'];
this.userObj = this._session.allUsers.filter(user => user.id.toString() === this.userId.toString())[0];
Я хочу запустить базовые модульные тесты для этого компонента. Однако я не уверен, как я могу ввести id
параметр, а компоненту этот параметр нужен .
Кстати: у меня уже есть макет Session
сервиса, так что не беспокойтесь.
unit-testing
angular
angular2-routing
angular2-testing
Колби Кокс
источник
источник
Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'ng:///DynamicTestModule/HomeContentComponent.ngfactory.js'. at http://localhost:9876/_karma_webpack_/polyfills.bundle.js:2605
of
следует использовать отдельно. Также вы, вероятно, использовали быRouterTestingModule
вместо этого кода ответа.Я понял, как это сделать!
Так
ActivatedRoute
как это услуга, для нее можно создать фиктивный сервис. Назовем это фиктивным сервисомMockActivatedRoute
. Мы будем расширятьActivatedRoute
вMockActivatedRoute
следующим образом :Строка
super(null, ....)
инициализирует суперкласс, у которого есть четыре обязательных параметра. Однако в этом случае нам ничего не нужно ни от одного из этих параметров, поэтому мы инициализируем ихnull
значениями. Все , что нам нужно это значение ,params
которое являетсяObservable<>
. Следовательно, сthis.params
мы переопределяем значениеparams
и инициализируем егоObservable<>
как параметр, на который полагается испытуемый.Затем, как и любой другой фиктивный сервис, просто инициализируйте его и переопределите поставщика для компонента.
Удачи!
источник
super
илиObservable
. Откуда они берутся?super()
встроен.Observable
отrxjs/Observable
или только вrxjs
зависимости от вашей версии. Вы бы это использовалиimport {Observable} from 'rxjs'
.В angular 8+ есть RouterTestingModule, который вы можете использовать, чтобы иметь доступ к ActivatedRoute или Router компонента. Также вы можете передавать маршруты в RouterTestingModule и создавать шпионов для запрошенных методов маршрута.
Например, в моем компоненте у меня есть:
И в моем тесте у меня есть:
а затем в разделе "это":
Подобным образом, я думаю, вы можете напрямую протестировать paramMap с помощью метода jasmine spyOnProperty, возвращая наблюдаемый объект или используя rxjs marbles. Это может сэкономить время, а также не требует поддержки дополнительного фиктивного класса. Надеюсь, что это полезно и имеет смысл.
источник
Вот как я тестировал это в последней версии angular 2.0 ...
и в разделе "Провайдеры"
источник
Просто добавьте макет ActivatedRoute:
...
источник
Для некоторых людей, работающих с Angular> 5, если Observable.of (); не работает, то они могут использовать только of (), импортировав import {of} из 'rxjs';
источник
Решите ту же проблему при создании наборов тестов для пути маршрутизации:
В компоненте я инициализировал переданное свойство как:
Если при запуске тестов вы не передадите значение свойства в своем имитирующем ActivatedRoute «useValue», то при обнаружении изменений с помощью «fixture.detectChanges ()» вы получите значение undefined. Это связано с тем, что фиктивные значения для ActivatedRoute не содержат свойства params.property. Затем для фиктивного useValue требуются эти параметры, чтобы прибор инициализировал this.property в компоненте. Вы можете добавить это как:
Вы можете начать тестирование, например:
Теперь, допустим, вы хотите протестировать другое значение свойства, затем вы можете обновить свой макет ActivatedRoute как:
Надеюсь это поможет!
источник
Добавлен провайдер в тестовый класс как:
источник