zwei Komponenten testen zusammen, Sie beide in der gleichen TestBed
zu laden haben. Zum Beispiel:
describe('component interaction',() => {
let fixture: ComponentFixture<PlayerListComponent>;
let component: PlayerListComponent;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [PlayerListComponent, PlayerAddComponent],
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(PlayerListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should set the parent flag when the child method is called',() => {
// Arrange
const child: PlayerAddComponent = fixture.debugElement
.query(By.directive(PlayerAddComponent))
.componentInstance;
// Act
child.clkCancle(); // ...Cancel?
fixture.detectChanges();
// Assert
expect(component.flag).toBe(false, 'parent flag should be set');
}
});
Andernfalls sollten Sie nur testen, ob das Kind zur richtigen Zeit abgibt, weil es nicht Teil des Kindes verantwortlich sein sollte, was als Ergebnis das passiert (dieses Verhalten ohne dem ändern könnte Kind verändert wird, oder unterschiedlich sein, je nachdem, wo das Kind verwendet wird):
it('should emit when the method is called', done => {
component.clkCancle(); // here component is PlayerAddComponent
component.notifyParent.subscribe(flag => {
expect(flag).toBe(false, 'should emit false');
done();
});
});
Beachten Sie, dass in beiden Fällen würde ich Tests empfehlen, dieses passiert, wenn Sie auf eine Schaltfläche klicken, zB mit fixture.nativeElement.querySelector('...').click();
, anstatt wenn die Methode aufgerufen wird; Dies hilft, das Verhalten von der Implementierung zu trennen, so dass Sie die internen Methoden umbenennen können, ohne die Tests zu aktualisieren.
* "Dies setzt die Elternkomponente" flag "auf" false "* - nein, das ist nicht der Job * des Kindes *. Das Kind gibt nur ab, was Sie in den Tests der Kindereinheit testen können; Es liegt an dem * Elternteil *, angemessen darauf zu reagieren. Wenn Sie die beiden Komponenten zusammen testen möchten, deklarieren Sie * both * in einem 'TestBed' und instanziieren Sie das übergeordnete Element. – jonrsharpe
Sie erstellen in Ihrem Test eine Komponente mit einer Vorlage wie ' ', und Sie testen, dass beim Klicken auf die Schaltfläche Abbrechen die Komponente tatsächlich markiert ist auf falsch gesetzt. Oder Sie verwenden die tatsächliche übergeordnete Komponente in Ihrem Test, wenn Sie die Integration des übergeordneten Elements und seines untergeordneten Elements testen möchten. –
Ich habe meine Spezifikationsdatei für die untergeordnete Komponente geschrieben und unterhalb von html in der übergeordneten Komponente verwendet, um sie zu binden. app-addplayer> –