2014-10-27 24 views
18

I testowanie mojej skośnych aplikacji z jaśminu (http://jasmine.github.io/2.0/) i uzyskanie kolejnego błędu: nieznane provider: $ scopeProvider < - $ zakres wiem, że jest to błędne zbudować zależność z zakresu w filtrach, usługach, fabrykach itp., ale używam $ scope w kontrolerze! Dlaczego otrzymuję ten błąd? Kontroler wygląda

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 = { 

     }; 
    }]); 

i kod mojego testu za:

'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

Gdzie jest twój test? – PSL

+0

Twoja składnia w kontrolerze jest poprawna. Najprawdopodobniej odwołujesz się do $ scope w dyrektywie lub usłudze, co jest nieprawidłowe. – user2808895

+0

Wypróbuj tę składnię: angular.module ('yourAppName'). Controller ('TestCont' – Coldstar

Odpowiedz

1

Zazwyczaj zakres $ będzie dostępny jako param wstrzykiwania tylko wtedy, gdy regulator jest załączony do DOM.

Musisz jakoś skojarzyć kontroler z DOMem (w ogóle jestem zaznajomiony z jaśminem).

34

Trzeba ręcznie przekazać w $scope do kontrolera:

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

Ale co jeśli chcesz przetestować $ scope kontrolera ? – Guy

+0

@Guy zakres, który przekazujesz, a zasięg kontrolera to ten sam obiekt, ponieważ jest zadeklarowany poza 'beforeEach', jest dostępny w' it'. Wszelkie zmiany dokonane w obiekcie scope w kontrolerze będą obecny w teście – Swoogan

+0

Jakie jest znaczenie tej linii: scope = $ rootScope. $ new(); – Guy

0

Mam następujący samouczek wideo z egghead (link mieszka), które sugerują, że to podejście:

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") 
     }) 
    }) 
}) 

Kontroler:

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

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

Zamieszczam go, ponieważ w wybranej odpowiedzi tworzymy nowy zakres. Oznacza to, że nie możemy przetestować vars zakresu kontrolera, nie?

Link do poradnika wideo (1min): https://egghead.io/lessons/angularjs-testing-a-controller

+0

W twoim przykładzie nie masz żadnego zakresu zmienne. Jeśli wstrzykniesz '$ scope' do kontrolera, test zakończy się niepowodzeniem z komunikatem o błędzie OP. Jeśli kontroler wymaga zakresu, należy ręcznie wprowadzić go do uprzęży testowej. Zobacz https://gist.github.com/Swoogan/98017f256edd37d49f42 dla przykładu testowania zmiennych zasięgu. – Swoogan

Powiązane problemy