2017-05-30 5 views
2

Ich habe auf der angular2-Website nachgesehen, sowie viele SO-Posts überprüft und konnte kein Beispiel finden, das nach Anwendungsfall veranschaulicht.Wie man ein @Input() Objekt in angular2 vortäuscht?

Ich möchte Daten von einem Objekt vortäuschen, das ein @Input() -Tag hat. Meine Komponente sieht wie folgt aus

... 
export class DriftInfoDisplayComponent implements OnInit { 

    showThisDriftInfo:boolean; 
    headerText:string; 
    informationText:string; 
    linkText:string; 
    @Input() inputInfo:DriftInfo; 

    constructor(){} 

    ngOnInit() { 
    this.headerText = this.inputInfo.headerText; 
    this.informationText = this.inputInfo.informationText; 
    this.linkText = this.inputInfo.linkText; 
    this.showThisDriftInfo = this.inputInfo.visible; 
    } 

    toggleDriftInfo(){ 
    this.showThisDriftInfo = ! this.showThisDriftInfo; 
    } 
} 

Meine Einheit Testdatei für diese Komponente wie folgt

describe('DriftInfoComponent',() => { 
    let component: DriftInfoDisplayComponent; 
    let fixture: ComponentFixture<DriftInfoDisplayComponent>; 


    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     declarations: [ DriftInfoDisplayComponent ] 
    }) 
    .compileComponents(); 
    })); 

    beforeEach(() => { 
    fixture = TestBed.createComponent(DriftInfoDisplayComponent); 
    component = fixture.componentInstance; 
    fixture.detectChanges(); 
    }); 

    it('should create',() => { 
    const fixture = TestBed.createComponent(DriftInfoDisplayComponent); 
    const drift = fixture.debugElement.componentInstance; 
    expect(drift).toBeTruthy(); 
    }); 
}); 

sieht Ich möchte einen Test schreiben, die die inputInfo spottet: DriftInfo und ihre Aufgabe in DriftInfoDisplayComponent und seine Eigenschaften damit ich testen kann, ob diese Daten in der HTML-Vorlage korrekt angezeigt werden. Wie kann ich das machen?

Danke für jede Hilfe, die zur Verfügung gestellt werden kann!

Antwort

5

Fügen Sie einfach es als Eigenschaft der Komponente im Test:

beforeEach(() => { 
    const fixture = TestBed.createComponent(DriftInfoDisplayComponent); 
    const drift = fixture.debugElement.componentInstance; 
    const driftInfo: DriftInfo = new DriftInfo(); 
    drift.inputInfo = driftInfo; 
}); 

it('should have input info',() => { 
    expect(drift.driftInfo instanceof DriftInfo).toBeTruthy(); 
)}; 
+0

Vielen Dank! Nur eine Frage. Ich habe By.css verwendet, um zu versuchen, ein HTML-Element aus der Vorlage auszuwählen, um zu überprüfen, dass die Daten dieses Objekts an der richtigen Stelle an die HTML-Vorlage gebunden werden. Meine Frage ist ... Ist das eine Verschwendung von Zeit, die HTML-Vorlage so zu überprüfen? Oder ist das besser für Integrationstests geeignet, und der Punkt von Karma/Jasmin besteht darin, die tatsächliche Logik in der Komponentendatei zu testen? – Dan

+0

Ich würde sagen, dass die Überprüfung der Daten im HTML-Objekt in den Bereich der Komponententests fallen könnte und für Karma/Jasmin geeignet wäre, aber ich stimme auch zu, dass es eine Art von Schmerz ist. In meinem Geschäft lassen wir alle Tests, die die Ansicht betreffen, bis zu End-to-End-Tests (unter Verwendung des Winkelmessers, der auch bei Angular CLI-generierten Projekten standardmäßig installiert wird). – joh04667

1

Stub ein Objekt, zum Beispiel:

const InputInfo = { 
     headerText: 'headerText', 
     informationText: 'informationText', 
     linkText: 'linkText', 
     visible: 'visible' }; 

es die Komponenteneigenschaft in Ihrem synchronen vor jedem zuordnen:

beforeEach(() => { 
    fixture = TestBed.createComponent(DriftInfoDisplayComponent); 
    element = fixture.debugElement.nativeElement; 
    component = fixture.debugElement.componentInstance; 
    component.inputInfo = InputInfo; // Assign stub to component property 
    fixture.detectChanges(); // calls NgOnit 
}); 

Testen Sie Ihre Vorlage:

it('should have a header',() => { 
const header = element.querySelector('h1').textContent; 

expect(header).toBe('headerText'); 
});