2017-09-29 2 views
0

Geordnete Komponente:Wie schreibe ich einen Testfall, der die Eigenschaft der Elternkomponente prüft?

export class PlayerListComponent { 
    flag = false; 
} 

Kinder Komponente:

export class PlayerAddComponent { 
    @Output() notifyParent: EventEmitter<any> = new EventEmitter(); 

    clkCancle() { 
    this.notifyParent.emit(false); 
    // this will set parent component property 'flag' to false. 
    } 
} 

Nun, wie kann ich ein Testfall in Jasmin schreiben Spec-Datei?

it('cancel button click should set flag to false', function() { 
    // Act 
    component.clkCancle(); 

    // Assert 
    // Since component do not have flag property. It will be set in parent while by Emitter. 
    expect(???).toBe(false); 
}); 
+0

* "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

+0

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. –

+0

Ich habe meine Spezifikationsdatei für die untergeordnete Komponente geschrieben und unterhalb von html in der übergeordneten Komponente verwendet, um sie zu binden.

Antwort

-2

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.

Verwandte Themen