2014-12-21 23 views
7

Utilizzando la pipeline di asset angolare v1.2.25 e rails, sto tentando di verificare che l'ambito isolato di una direttiva sia stato effettivamente aggiornato. Dal momento che isolateScope() restituisce undefined mi sto aspettavo definito da definire ...'isolateScope() che restituisce undefined durante il test della direttiva angolare

describe("cool directive", function() { 

    beforeEach(module('necessaryModule')); 

    var scope, $rootScope, $compile, elem, 
    baseElement = '<div auto="mock_a" inc="mock_p" method="mock_m" reset-method="mock_r"></div>'; 

    beforeEach(inject(function(_$rootScope_, _$compile_, _$httpBackend_, $http){ 
    $compile = _$compile_; 
    $rootScope = _$rootScope_; 
    scope = $rootScope.$new(); 
    angular.extend(scope, { 
     mock_a: [ 
     {name: "example1"}, 
     {name: "example2"} 
     ], 
     mock_m: function(){ 
     return $http.get('/mockBackend', { 
      params:{ 
      page: scope.mockPage 
      } 
     }); 
     }, 
     mock_r: function() { 
     scope.page = 1; 
     scope.list = []; 
     load(); 
     }, 
     mock_p: 1 
    }); 
    $httpListGet = _$httpBackend_; 
    $httpListGet.whenPOST('/api/something').respond({}); 
    $httpListGet.whenGET('/mockBackend').respond({name: "example3"}); 
    $httpListGet.whenGET('/mockBackend?page=1').respond({name: "example3"}); 
    $httpListGet.whenGET('/mockBackend?page=2').respond({name: "example4"}); 
    })); 

    var create = function() { 
     elem = angular.element(baseElement); 
     compiledElement = $compile(elem)(scope); 
     elem.scope().$apply(); 
     return compiledElement; 
    }; 

    it("has 'list' defined", function() { 
    var compiledElem = create(); 
    var isolateElemScope = compiledElem.isolateScope(); 
    $rootScope.$apply(); 
    console.log('isolateElemScope',isolateElemScope); 
    expect(isolateElemScope.list).toBeDefined(); 
    }); 

Mi aspetto il campo di applicazione delle direttive sia accessibile e verificabile, ma sto ottenendo indefinita quando prova per esso. Grazie.

+1

a prima vista, direi di eliminare 'elem.scope(). $ Apply();' dalla funzione 'create' e cambia' $ rootScope. $ Apply() 'a' scope. $ digest() '. – dcodesmith

risposta

12

per ottenere l'isolateScope io uso il seguente codice

compiledElem.children().scope() 

Ciò è dovuto al fatto che la maggior parte delle direttive non usano replace, il che significa che il tag directive è sulla pagina, e il directive implementation viene aggiunto come figli di quel tag. In tal caso, l'ambito isolato apparterrà ai bambini.

Anche se questo non è il caso, lo snippet deve ancora lavorare - come i bambini si divideranno la portata del genitore ..

L'unico caso che non funziona, è uno scenario estremo in cui si dispone di 2 annidati direttive, laddove quello interno usa la sostituzione. ma non l'ho mai visto.

+0

sei completamente corretto sulle direttive nidificate. – sjt003

0

Altre persone che vengono a questa pagina potrebbero aver aggiunto il test al gelsomino ma hanno dimenticato di aggiungere un riferimento alla loro direttiva.

+0

Come si fa per favore? –

Problemi correlati