un test è scritto per ogni direttiva. Dal momento che la direttiva utilizza templateUrl, ho usato html2js. la chiave html deve essere inclusa come modulo - che inserisce il modello nel templateCache.
Quindi, ho compilato la direttiva ed eseguito la funzione di collegamento con rootScope. Ho avuto problemi con il template html - risolto usando $ digest. Aveva problemi di associazione dei dati, risolti attraverso la comprensione. Tutto lo ha documentato qui sotto.
codice qui sotto,
direttiva:
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
});
});
Hey Lior, voglio solo dire, grazie. Stavo provando a testare una direttiva angular.js facendo uso di templateUrl (invece di template) e stavo cercando di evitare di colpire il modello attuale. Ho usato una variante molto simile della tua risposta, l'unica differenza è che non ho usato html2js; invece ho iniettato $ templateCache e ho fatto restituire una stringa, e questo ha funzionato perfettamente per me. Ancora una volta grazie! – yanhan
solo il problema che sto avendo con questo è dove si trova il modello parziale. come puoi sapere quale percorso usare? –
Il percorso è relativo alla radice dell'applicazione, ad es. dove risiede il principale 'app.js'. – demisx