En yüksek oyu alan cevaplar işe yarasa da, iyi test uygulamaları göstermiyorlar, bu yüzden Günter'in cevabını bazı pratik örneklerle genişleteceğimi düşündüm .
Aşağıdaki basit bileşene sahip olduğumuzu düşünelim:
@Component({
selector: 'my-demo',
template: `
<button (click)="buttonClicked()">Click Me!</button>
`
})
export class DemoComponent {
@Output() clicked = new EventEmitter<string>();
constructor() { }
buttonClicked(): void {
this.clicked.emit('clicked!');
}
}
Bileşen, test edilen sistemdir, parçalarını gözetlemek kapsüllemeyi bozar. Açısal bileşen testleri yalnızca üç şeyi bilmelidir:
- DOM (örneğin aracılığıyla erişilir
fixture.nativeElement.querySelector
);
@Input
S ve @Output
lerin isimleri ; ve
- İşbirliği hizmetleri (DI sistemi yoluyla enjekte edilir).
Örnekte yöntemlerin doğrudan çağrılmasını veya bileşenin bazı kısımlarında casusluk yapılmasını içeren her şey, uygulama ile çok yakından ilişkilidir ve yeniden düzenlemeye sürtünme katacaktır - test çiftleri yalnızca ortak çalışanlar için kullanılmalıdır. Bu durumda, işbirlikçimiz olmadığı için, herhangi bir alay, casus veya diğer test çiftlerine ihtiyacımız olmamalı .
Bunu test etmenin bir yolu, doğrudan yayıcıya abone olmak ve ardından tıklama eylemini başlatmaktır (bkz. Girişler ve çıkışlar içeren bileşen ):
describe('DemoComponent', () => {
let component: DemoComponent;
let fixture: ComponentFixture<DemoComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ DemoComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DemoComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should emit when clicked', () => {
let emitted: string;
component.clicked.subscribe((event: string) => {
emitted = event;
});
fixture.nativeElement.querySelector('button').click();
expect(emitted).toBe('clicked!');
});
});
Bu, doğrudan bileşen örneğiyle etkileşime girse de, adı @Output
genel API'nin bir parçasıdır, bu nedenle çok sıkı bir şekilde bağlı değildir.
Alternatif olarak, basit bir test ana bilgisayarı oluşturabilir (bkz. Bir test ana bilgisayarı içindeki Bileşen ) ve bileşeninizi fiilen monte edebilirsiniz:
@Component({
selector: 'test-host',
template: `
<my-demo (clicked)="onClicked($event)"></my-demo>
`
})
class TestHostComponent {
lastClick = '';
onClicked(value: string): void {
this.lastClick = value;
}
}
daha sonra bileşeni bağlam içinde test edin:
describe('DemoComponent', () => {
let component: TestHostComponent;
let fixture: ComponentFixture<TestHostComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ TestHostComponent, DemoComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TestHostComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should emit when clicked', () => {
fixture.nativeElement.querySelector('button').click();
expect(component.lastClick).toBe('clicked!');
});
});
componentInstance
Burada Test konak biz aşırı biz aslında test ediyoruz bileşene bağlı değiliz emin olabilirsiniz.