In meiner Komponente zum Scheitern verurteilt ich eine untergeordnete Komponente habe, die wie folgt aussieht:Mit @ViewChild {lesen: ElementRef} der Komponente bewirkt, dass Unit-Test
<child-component #childComponent></childComponent>
In meiner Elternkomponente ich dann dieses Kind zugreifen Komponente mit @ ViewChild und der read
Parameter, um die ElementRef und nicht die Komponentenreferenz zu erhalten. Ich brauche das ElementRef, um sicherzustellen, dass ich einige Eigenschaften von nativeElement
bekommen kann, die ich brauche. Es ist also wie folgt aus:
export class ParentComponent {
@ViewChild('childComponent', { read: ElementRef }) public childComponent: ElementRef;
public position: string;
// some way down the code
private someMethod() {
if (this.childComponent.nativeElement.offsetLeft > 500) {
this.position = 'left';
} else {
this.position = 'right';
}
}
}
So dies für die Anwendung funktioniert, aber ich die Prüfungen schreibe und das Kind Komponente spöttisch, wie folgt aus:
@Component({
selector: 'child-component',
template: ''
})
class ChildComponentMockComponent {
private nativeElement = {
get offsetLeft() {
return 600
}
};
}
beforeEach(async(() => TestBed.configureTestingModule({
imports: [ ... ],
declarations: [ ParentComponent, ChildComponentMockComponent ],
providers: [ ... ],
schemas: [ NO_ERRORS_SCHEMA ]
}).compileComponents()));
it('should have the correct position, based on position of child-component',() => {
spyOn(component, 'someMethod');
expect(component.someMethod).toHaveBeenCalled();
expect(component.position).toBe('left');
});
so der Test die Komponente kompilieren, und Verwenden Sie die gemockten untergeordneten Komponentenwerte als den richtigen Wert, und berechnen Sie den Wert this.position
, der dann im Test bestätigt wird.
Wenn jedoch der Parameter { read: ElementRef }
festgelegt ist, wird der Mock vom TestBed vollständig ignoriert, obwohl er im Deklarationsarray hinzugefügt wird. Wenn ich { read: ElementRef }
entferne, wird der Schein im Test verwendet und es passiert. Aber dann funktioniert meine Anwendung nicht, da sie jetzt die Komponentenreferenz erhält, bei der die nativeElement
-Eigenschaft nicht existiert, und nicht die Elementreferenz.
Wie bekomme ich das ElementRef in meiner Anwendung und dann in meinem Test die Mock-Komponente?
können Sie den Testfall hinzufügen, die Sie geschrieben haben, so kann ich Ihnen helfen, zu fixieren – Aravind
Hallo @Aravind, wird die Eigenschaft nicht tatsächlich in dem Test, sorry für mehrdeutig verwendet. Aber der Test kompiliert die Komponente unter Verwendung der mocked child-Komponente anstelle der richtigen, und dann verwendet sie im Anwendungscode für die Komponente den Wert, den ich im Mock gesetzt habe, anstelle von irgendetwas anderem. Der App-Code setzt eine Variable (true/false) basierend auf der Position der Kindkomponente, die ich dann im Test bestätige. Es ist ziemlich verwirrend, aber ich habe meinem ursprünglichen Beitrag etwas mehr Details hinzugefügt. –
Wenn Sie readElementRef verwenden, wird keine Komponenteninstanz verwendet. Warum deklarieren Sie also die Eigenschaft 'nativeElement' für die Komponenteninstanz? Möchtest du 'elementRef' vortäuschen? –