Как вы вводите службу angular2 в модульный тест? (RC3)
Я использую RC3
, Я реализую новый Angular2
маршрутизатор, как описано здесь: https://angular.io/docs/ts/latest/guide/router.html
Все работает нормально, но у меня проблемы с модульным тестированием. В частности, я не могу вводить Angular2
услуги в мои юнит-тесты.
Мой соответствующий код компонента:
import {Component} from '@angular/core';
import {ActivatedRoute} from '@angular/router';
@Component({
templateUrl: ...
styleUrls: ...
})
export class Route1DetailComponent {
constructor(private route:ActivatedRoute) {
console.log(route);
}
}
мой юнит тест выглядит так:
import {
expect, it, iit, xit,
describe, ddescribe, xdescribe,
beforeEach, beforeEachProviders, withProviders,
async, inject
} from '@angular/core/testing';
import {ActivatedRoute} from '@angular/router';
import {Route1DetailComponent} from './route1-detail.component';
import {TestComponentBuilder} from '@angular/compiler/testing';
describe('route1-detail.component.ts', () => {
beforeEachProviders(() => [
{provide: ActivatedRoute, useClass: ActivatedRoute}
]);
it('should instantiate component',
async(inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: ActivatedRoute) => {
tcb.createAsync(Route1DetailComponent).then((fixture) => {
expect(fixture.componentInstance instanceof Route1DetailComponent).toBe(true, 'should create Route1DetailComponent');
console.log(ar);
});
})));
});
Модульный тест "следует создать компонент" не пройден. Ошибка:
Не удается разрешить все параметры для 'ActivatedRoute'(?,?,?,?,?). Убедитесь, что все параметры оформлены с помощью Inject или имеют действительные аннотации типов, а "ActivatedRoute" - с помощью Injectable.
Как мне заставить это работать?
Когда я не делаю инъекцию ActivatedRoute
все отлично работает
Благодарю.
1 ответ
При модульном тестировании иногда определенная служба вызывает проблемы только потому, что она не используется в обычной среде. Вы можете проверить, был ли он вызван, не выполняя модульное тестирование всей службы. Сделайте это, создав фиктивный класс.
describe('route1-detail.component.ts', () => {
class MockActivatedRoute {}
beforeEachProviders(() => [
{provide: ActivatedRoute, useClass: MockActivatedRoute}
]);
it('should instantiate component',
async(inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: MockActivatedRoute) => {
tcb.createAsync(Route1DetailComponent).then((fixture) => {
expect(fixture.componentInstance instanceof Route1DetailComponent).toBe(true, 'should create Route1DetailComponent');
console.log(ar);
});
})));
Обратите внимание на эту часть: inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: MockActivatedRoute
, Когда код ищет ActivatedRoute, вы передаете ему фиктивный сервис. Конечно, если вы специально пытаетесь выполнить модульное тестирование самого ActivatedRoute, то создание фиктивного сервиса откажется от этой цели. Возможно, вам придется добавить методы или переменные в класс mock, если он попытается вызвать методы из этого сервиса.