2016-06-28 91 views
5

我正在使用RC3。我正在執行新的Angular2路由器,如下所述:https://angular.io/docs/ts/latest/guide/router.html如何將angular2服務注入單元測試? (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'用 可注射裝飾。

我該如何得到這個工作?

當我不注入ActivatedRoute一切工作正常。

感謝。

+2

https://github.com/angular/angular/blob/fcfddbf79cfbdca45771bb31c0a2c1f55cff5801/modules/%40angular/router/test/router.spec.ts可能有幫助 –

+0

非常感謝,仍然在這個非常有用的thx工作 - 更多的想法歡迎: ) – 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

相關問題