2016-04-05 6 views
4

Ich habe die folgende Komponente:Wie testen Sie Unit eine Bindung mit einem anderen Namen in einer Angular 1.5-Komponente?

angular.module('foo') 
    .component('searchInput', { 
     bindings: { 
      text: "<query" 
     }, 
     templateUrl: 'components/searchInput/searchInput.html', 
     controller: 'SearchInputCtrl' 
    }); 

Für folgendes passieren:

expect(component.text).toBe('bar'); 

Ich habe den folgenden Code verwenden:

var component = $componentController('searchInput', 
     {$scope: {}}, 
     { 
      text: 'bar' 
     } 
    ); 

Ich möchte jedoch, dass testen Der an 'text' gebundene Wert wird von 'query' bezogen. Diese nicht Arbeit:

var component = $componentController('searchInput', 
     {$scope: {}}, 
     { 
      query: 'bar' 
     } 
    ); 

Antwort

7

Sie können diese Art der Sache prüfen, indem die Komponente kompilieren. z.B.

inject(function($compile, $rootScope) { 
    var parentScope = $rootScope.$new(); 
    parentScope.myVar = 'test'; 

    var element = angular.element('<search-input query="myVar"></search-input>'); 

    var compiledElement = $compile(element)(parentScope); 
    parentScope.$digest(); 

    var scope = compiledElement.isolateScope(); 

    expect(scope.$ctrl.text).toBe('test'); 
}); 
+0

, dass mein Kopf gegangen, aber ich möchte etwas mehr im Einklang mit dem, was die Winkel Entwickler Vorgeschlagen ist: $ Component - es ist einfach und Sie DOM vermeiden und damit die zusätzlichen Schritte zum Kompilieren und zu verdauen. –

+0

Je mehr ich darüber nachdachte und die Angular-Quelle betrachtete, wie @rob darauf hinwies, ist die Arbeit mit DOM der einzige Weg. Da Komponenten syntaktischer Zucker für Richtlinien sind, sollte ich die gleichen Denkweisen/Erwartungen haben, wenn ich einen von ihnen teste. Wenn ich den Controller einer (expliziten) Direktive über $ controller teste, kann ich den Namen der Zielbindung angeben; Das gleiche sollte beim Testen des Steuergeräts einer Komponente über $ componentController zutreffen. Beim Testen des Quellattributs für eine Direktive verwende ich DOM und überprüfe isolateScope(); Das Gleiche gilt für Komponentenquellattribute. –

+0

Ich hatte ähnliches Problem, wenn ich eine Variable in der Bindung wie definiert übergeben: '' Es hat nicht funktioniert, aber wenn ich das gleiche zugewiesen Ding in einem Umfang Variable und übergeben wie: '' es funktionierte nicht sicher warum? – Pawan