![](/img/trans.png)
[英]How to do asynchronous validation with Reactive Forms (Angular2 RC3)?
[英]How do you inject an angular2 service into a unit test? (RC3)
我正在使用RC3
。 我正在實現此處記錄的新Angular2
路由器: https : Angular2
一切正常,但我在單元測試中遇到問題。 具體來說,我無法將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
一切正常。
謝謝。
在進行單元測試時,有時某個服務會導致問題,只是因為它沒有在正常環境中使用。 您可以進行測試以查看是否已調用它,而無需在整個服務中運行單元測試。 通過創建一個模擬類來做到這一點。
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本身進行單元測試,然后創建模擬服務將無法達到目的,如果嘗試從該服務調用方法,則可能必須向模擬類添加方法或變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.