2014-10-27 13 views
18

ho testare la mia angolare-applicazione con il gelsomino (http://jasmine.github.io/2.0/) e ottenendo il prossimo errore: Unknown fornitore: $ scopeProvider < - $ portata lo so, che non è corretto per costruire la dipendenza con portata in filtri, servizi, fabbriche, ecc., ma io uso $ scope in controller! Perché sto ricevendo questo errore? Controller assomiglia

testModule.controller('TestCont', ['$filter', '$scope', function($filter, $scope){ 

     var doPrivateShit = function(){ 
      console.log(10); 
     }; 

     this.lol = function(){ 
      doPrivateShit(); 
     }; 

     this.add = function(a, b){ 
      return a+b; 
     }; 

     this.upper = function(a){ 
      return $filter('uppercase')(a); 
     } 

     $scope.a = this.add(1,2); 

     $scope.test = 10; 

     $scope.search = { 

     }; 
    }]); 

e il codice del mio test:

'use strict'; 

describe('testModule module', function(){ 
    beforeEach(function(){ 
     module('testModule'); 
    }); 

    it('should uppercase correctly', inject(function($controller){ 
     var testCont = $controller('TestCont'); 
     expect(testCont.upper('lol')).toEqual('LOL'); 
     expect(testCont.upper('jumpEr')).toEqual('JUMPER'); 
     expect(testCont.upper('123azaza')).toEqual('123AZAZA'); 
     expect(testCont.upper('111')).toEqual('111'); 
    })); 
}); 
+0

Dov'è il tuo test? – PSL

+0

La sintassi nel controller è corretta. Molto probabilmente stai facendo riferimento a $ scope in una direttiva o servizio, che non è corretto. – user2808895

+0

Prova questa sintassi: angular.module ('YourAppName') di controllo ('TestCont' – Coldstar

risposta

1

Normalmente, un $ ambito sarà disponibile come param iniettabile solo quando il controller è collegato al DOM.

È necessario associare in qualche modo il controller al DOM (I'm mot familiarmente con il gelsomino).

34

È necessario passare manualmente in un $scope al controller:

describe('testModule module', function() { 
    beforeEach(module('testModule')); 

    describe('test controller', function() { 
     var scope, testCont; 

     beforeEach(inject(function($rootScope, $controller) { 
      scope = $rootScope.$new(); 
      testCont = $controller('TestCont', {$scope: scope}); 
     })); 

     it('should uppercase correctly', function() { 
      expect(testCont.upper('lol')).toEqual('LOL'); 
      expect(testCont.upper('jumpEr')).toEqual('JUMPER'); 
      ... 
     }); 
    }); 
}); 
+0

Ma cosa succede se si desidera verificare il $ ambito del controllore.. ? – Guy

+0

@Guarda l'ambito che stai passando e l'ambito del controller sono lo stesso oggetto.Dopo che è dichiarato al di fuori di 'beforeEach', è disponibile in' it'. Qualsiasi modifica apportata all'oggetto scope nel controller sarà presente nel test – Swoogan

+0

Quindi qual è il significato di questa riga: scope = $ rootScope. $ new(); – Guy

0

sto seguendo un tutorial video da testa d'uovo (link sotto) che suggeriscono questo approccio:

describe("hello world", function() { 
    var appCtrl; 
    beforeEach(module("app")) 
    beforeEach(inject(function ($controller) { 
     appCtrl = $controller("AppCtrl"); 
    })) 

    describe("AppCtrl", function() { 
     it("should have a message of hello", function() { 
      expect(appCtrl.message).toBe("Hello") 
     }) 
    }) 
}) 

Controller:

var app = angular.module("app", []); 

app.controller("AppCtrl", function() { 
    this.message = "Hello"; 
}); 

Sto pubblicandolo perché nella risposta selezionata stiamo creando un nuovo ambito. Ciò significa che non possiamo testare le vele del controller, no?

link al video tutorial (1min): https://egghead.io/lessons/angularjs-testing-a-controller

+0

Nel tuo esempio non hai alcun ambito variabili. Se si inietta '$ scope' nel controller, il test fallirà con il messaggio di errore dell'OP. Se il controller richiede un ambito, è necessario inserirlo manualmente nel cablaggio di prova. Vedere https://gist.github.com/Swoogan/98017f256edd37d49f42 per un esempio di verifica delle variabili di ambito. – Swoogan

Problemi correlati