2013-06-20 5 views
5

EDIT: Nachdem ich die Frage gestellt habe, bearbeite ich das nun, um meine Ergebnisse zu erläutern.Testen von Direktiven, die TemplateUrl und Controller verwenden?

Meine App ist mit Direktiven modularisiert. Ich schreibe meine Direktiven so, dass sie (1) ihren eigenen Bereich erstellen (2) templateUrl verwenden und (3) den Großteil der Logik- und Serverdaten in ihrem Controller abrufen.

Die Frage ist, wie man es mit Mocha mit Karma testen kann.

Antwort

7

ein Test wird für jede Direktive geschrieben. Da die Direktive templateUrl verwendet, habe ich html2js verwendet. Der html-Schlüssel sollte als Modul enthalten sein - das legt die Vorlage in den templateCache.

Dann kompilierte ich die Richtlinie und führen Sie die Link-Funktion mit RootScope. Ich hatte Probleme mit der Vorlage HTML - gelöst mit $ Digest. Hatte Datenbindungsprobleme, die durch Verständnis gelöst wurden. Alles dokumentiert es unten. unter

Code,

Richtlinie:

angular.module('myApp') 
.directive('productThumb', function(){ 
    return { 
    restrict: 'AE', 
    scope: true, 
    templateUrl: 'partials/directives/product-thumb.html', 
    // controller does most of the work 
    controller: ProductThumbController 

    } 
}) ; 

describe("Unit: Testing Directives", function() { 
var elm, scope, linkFn; 
beforeEach(
    module('ogApp','partials/directives/product-thumb.html') // puts product-thumb.html 
                  // into templateCache 
); 


beforeEach(inject(function($rootScope, $compile) { 
    elm = angular.element('<product-thumb></product-thumb>'); 
    scope = $rootScope; 
    linkFn = $compile(elm); 
    scope.$digest(); // have to digest to bring html from templateCache 
    console.log('post compile',elm.html());// <== the html here still have {{}} 
})); 

it('should show a thumb',function() { 
    inject(function($controller) { 
     linkFn(scope); // <== this will create a new scope (since our directive creates 
         // new scope), runs the controller with it, and bind 
         // the element to that new scope 
     scope.$digest(); 
     console.log('post link',elm.html());// <== the html is bound 

     // inject test data (controller sets up an $on handler for addProductData event) 
     scope.$broadcast('addProductData',{title:"TEST DISPLAY NAME", 
              productId: "123", mainImageUrl: "TEST.JPG"}); 
     scope.$digest(); 
     expect(elm.find('H5').text()).to.equal("TEST DISPLAY NAME"); // <=== success 
    }); 
}); 
+1

Hey Lior, ich möchte nur sagen, danke. Ich habe versucht, eine angular.js-Direktive zu testen, die templateUrl (anstelle von template) verwendet, und ich versuchte zu vermeiden, die tatsächliche Vorlage zu treffen. Ich habe eine sehr ähnliche Variante Ihrer Antwort verwendet, nur dass ich html2js nicht verwendet habe; Stattdessen habe ich $ templateCache injiziert und dafür gesorgt, dass eine Zeichenkette zurückgegeben wurde, und das funktionierte perfekt für mich. Nochmals vielen Dank! – yanhan

+0

nur Problem, das ich hier habe, ist, wo die partielle Vorlage befindet. Wie kannst du wissen, welchen Weg du benutzen musst? –

+0

Der Pfad ist relativ zum Anwendungsstamm, z. wo sich die Hauptdatei 'app.js' befindet. – demisx

Verwandte Themen