我想測試使用其他服務的組件。我想通過提供服務模擬來分離組件。在RC5之前,我可以簡單地使用addproviders
,它現在已被棄用,並將由下一個RC刪除。相反,我必須使用TestBed
。當我提供模擬角度出於某種原因時,請繼續尋找模擬依賴的服務。並拋出一個DI exception
。當我提供測試的所有依賴時,我不想重複每個測試套件。這打破了基本的面向對象原則。 我的測試套件:Angular 2 TestBed with mocks
describe('Component: DummyRestApi',() => {
class DummyRestApiTestService {
GetAll() {
return Rx.Observable.create(observer => {
let data:Data[] = [];
data.push({
id: 0,
data: 'data'
});
observer.next(data);
observer.complete();
});
}
Add(data) {
}
}
let fixture;
let myMockWindow:Window;
// ToDo use the mocks
beforeEach(() => {
myMockWindow = <any> {location: <any> {hostname: '127.0.0.1'}};
TestBed.configureTestingModule({
declarations: [DummyRestApiComponent],
providers: [
// ServerAddressResolverService,
DummyRestApiComponent,
// ConfigurationService,
{provide: DummyRestApiService, useClass: DummyRestApiTestService},
// {provide: Window, useValue: myMockWindow}
],
imports: [FormsModule, HttpModule]
});
TestBed.compileComponents().catch(error => console.error(error));
// addProviders([
// DummyRestApiComponent,
// {provide: DummyRestApiService, useClass: DummyRestApiTestService},
// ]);
});
describe('Initializing',() => {
beforeEach(async(() => {
console.log('Compiling');
TestBed.compileComponents().catch(error => console.error(error));
console.log('Compiling again');
}));
it('should create an instance', async(() => {
var fixture = TestBed.createComponent(DummyRestApiComponent);
fixture.detectChanges();
expect(fixture.debugElement.componentInstance).toBeTruthy();
}
));
});
角2.0.0 RC5
我證實了這一點。您必須爲該服務指定導入,就好像它沒有被模擬。至少在RC5中。不過,該測試將使用模擬服務。 – Dave