2016-06-28 2 views
5

Я использую RC3. Я внедряю новый маршрутизатор Angular2, как описано здесь: https://angular.io/docs/ts/latest/guide/router.htmlКак вы вводите услугу углового2 в единичный тест? (RC3)

Все работает нормально, но у меня возникают проблемы при тестировании модулей. В частности, я не могу ввести 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 все работает нормально.

Спасибо.

+2

https://github.com/angular/angular/blob/fcfddbf79cfbdca45771bb31c0a2c1f55cff5801/modules/%40angular/router/test/router.spec.ts может помочь –

+0

высоко ценятся до сих пор работают над этим очень полезным ТНХОМ - больше идей приветствуются:) – danday74

ответ

9

При тестировании модулей иногда определенный сервис вызывает проблемы только потому, что он не используется в обычной среде. Вы можете проверить, не было ли это вызвано, без проверки единичного теста через всю службу. Сделайте это, создав класс-макет.

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, если он пытается вызвать методы из этой службы.

+0

очень полезно спасибо - все еще работаю над этим – danday74

+0

получился отличный ответ - большое вам спасибо – danday74

+0

Рад помочь @ danday74 – jhhoff02