單元測試已經在名稱中。你只想測試一個單元。您的Tab
組件應該單獨測試。它沒有真正的依賴於你的Tabs
組件。
因此,一個測試可能是這個樣子:
@Component({
template: `<tab tabTitle="tabTitle">{{ content }}</tab>`
})
class TestHostComponent {
@ViewChild(TabComponent) tab: TabComponent;
content: string = '';
tabTitle: string = 'foo';
}
describe('TabComponent', function() {
let fixture: ComponentFixture<TestHostComponent>;
let comp: TestHostComponent;
let debugElement: DebugElement;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ TestHostComponent ]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TestHostComponent);
comp = fixture.componentInstance;
debugElement = fixture.debugElement;
fixture.detectChanges(); // ngOnInit
});
it('should create the component',() => expect(comp).toBeDefined());
it('should change the title',() => {
expect(comp.tab.tabTitle).toBe('foobar');
comp.tabTitle = 'bar';
fixture.detectChanges();
expect(comp.tab.tabTitle).toBe('bar');
});
it('should change the content',() => {
comp.content = 'foobar';
fixture.detectChanges();
let tabTextContent: string = debugElement.query(By.css('tab')).nativeElement.textContent;
expect(tabTextContent).toBe('foobar');
});
});
當然,如果你真的想在同一時間來測試,你以類似的方式做到這一點,只是改變你的testhost而模板爲類似
@Component({
template: `<tabs><tab tabTitle="tabTitle">{{ content }}</tab></tabs>`
});
和調整ViewChilds
和你的方式處理ngOnInit
和AfterViewInit
。
但正如我所說,這是不推薦的(你可以做,在你的TabsComponent
測試,以檢查他們是否有一個或多個TabComponents
裏面你Tabs
工作正常,但不是在你的TabComponent
)。因爲它使得測試更加困難和更具體(你必須控制angulars生命週期鉤子等),每個測試集合的大小越來越混亂(這是不好的,因爲你必須改變最東西當你對組件進行修改的時候),並且由於它是一個獨立的組件,所以你可以在你希望將其包含在其他地方的場景中運行,並且也必須覆蓋它。
希望我能幫助你。
嘿!這使事情變得更清晰。謝謝:) –
不客氣:) – lexith
嗨@lexith,是不是這樣,像''應該改變標題'的測試就像測試輸入綁定是否工作?這些測試必須已經由Angular人員完成。我們應該測試一些更好的東西,還有別的東西? –