2016-12-20 1 views
3

Ich habe eine Angular 2-App, an der ich arbeite, die aus Kompatibilitätsgründen mit Legacy-Code einige Informationen über Attribute abrufen muss, die in der App-Komponente verwendet werden. Zum Beispiel kann der HTML-Code, um die Winkel 2 App startet würde wie folgt aussehen:Angular 2 nativeElement-Attributprüfung in der App-Komponente

<myApp id="xyz" areaDone="true" value="" requestID="abc"> Loading ... </myApp> 

Allerdings, wenn ich versuchen, einige Unit-Tests, um das Verhalten zu schreiben, die auf das Vorhandensein und den Wert dieser Attribute auftreten basieren soll , sie sind null/undefiniert.

Um die Werte zu erhalten, wir ziehen sie einfach im Konstruktor wie folgt aus:

 let native = this.elementRef.nativeElement; 
     this.requestID= native.getAttribute("requestID"); 

, also ist es eine Möglichkeit, durch die Testbed/Anbieter eine native Element zu erzwingen, dass die erwarteten Eigenschaften haben sollte?

Antwort

3

Sie können this.elementRef.nativeElement.attribute aufrufen, und das wird eine NamedNodeMap (http://www.w3schools.com/jsref/prop_node_attributes.asp) Ihrer Attribute zurückgeben.

Syntax für Sachen aus NamedNodeMaps bekommen ist nicht schrecklich, das ich die x1-Attribut von einem d3 Objekt in einem meinem Test

const nodeAttributes = compiled.querySelector('#temp-draggable-link-line').attributes as NamedNodeMap; 
expect(nodeAttributes.getNamedItem('x1').value).toEqual(200); 
+0

Ich verstehe immer, dass, wie die Attribute in der sehen test, aber was ich brauche, ist zu wissen, wie man sie auf das Quellelement setzt. Soweit ich das beurteilen kann, startet das Test-Netzwerk einfach mit einem div-Tag mit einem id-Attribut, und ich kann keine Möglichkeit finden, entweder ein gespottetes ElementRef in den Konstruktor zu injizieren oder den Test-Runner einzurichten, um diese zu übergeben Attribute in der Dom gelesen werden – jspriggs

+0

Entschuldigung, Ihre Frage vollständig missverstanden. Ich habe gerade den Code durchgesehen und es sieht so aus, als gäbe es nur vier Verweise auf die Funktion 'insertRootElement' in @ angular/core/testing. Wo die Funktion definiert ist, braucht sie nur einen Parameter (die ID) und wo sie verwendet wird, ruft sie diese Funktion auf und ruft dann sofort die Komponentenfabrik auf. Ich denke nicht, dass dies möglich sein wird, es sei denn, Sie geben dies oder PR es. –