2013-01-09 12 views
11

Próbuję przetestować kontroler korzystający z zasobów $ kątowych.

function PermissionsCtrl($scope, $resource, $cookies) { 
    var Object = $resource('/v1/objects/:id'); 
    loadObjects(); 

    function loadObjects() { 
    $scope.myAppObjects = new Array(); 

    var data = AppObject.get({find: '{"app_id": '+wtm.app_id+'}'}, 
     function(){ 
     if (data.results) { 
      for(var i = 0; i< data.results.length; i++) { 
      if(!data.results[i].is_deleted) { 
       (function(i){ 
       $scope.objects(data.results[i]); 
       }(i)); 
      } 
      } 
     } 
     }, 
     function(error){console.log(error);}); 
    } 

A tutaj jest kod testowy.

var apiServer = "..."; 
var app_id = 999 
var mock_object_data = {...}; 


describe('apps permissionsCtrl', function(){ 
    var scope, ctrl, $httpBackend; 

    // Create a matcher for comparing data 
    beforeEach(function() { 
    this.addMatchers({ 
     toEqualData: function(expected) { 
     return angular.equals(this.actual, expected); 
     } 
    }); 
    }); 

    // Create the controller with injected data/services 
    beforeEach(inject(function(_$httpBackend_, $rootScope, $controller, $resource) { 
    $httpBackend = _$httpBackend_; 
    // cookie data to inject 
    var cookies = new Array(); 
    cookies['id'] = '...'; // just needs to be declared 


    $httpBackend.expectGET(apiServer+'/v1/app_objects? find=%7B%22app_id%22:'+app_id+'+%7D&access_token=' + cookies['id']) 
     .respond(mock_object_data); 

    var $injector = angular.injector(['ng', 'ngResource']); 
    var $resource = $injector.get('$resource'); 

    scope = $rootScope.$new(); 
    ctrl = $controller(PermissionsCtrl, {$scope: scope, $cookies: cookies, $resource: $resource}); 
    })); 

    it('should put object data into $scope', function() { 
    $httpBackend.flush(); 
    expect(scope.objects).toEqualData(mock_object_data); 

}); });

Kiedy uruchamiam to mam

Error: Unknown provider: $resourceProvider <- $resource 

w wierszu, w którym staram się tworzyć mojego kontrolera. Nie rozumiem, jak wprowadzić to do kontrolera i bez względu na to, co próbuję, otrzymuję ten sam błąd. Kilka rzeczy, które wypróbowałem, to:

  • Deklarowanie pustego obiektu próbnego i przekazanie go przez podobną do mojej zmiennej plików cookie. Sądzę, że jest to prawdopodobnie złe rozwiązanie, ponieważ właściwie chcę korzystać z usługi.
  • Naśladowanie makiety i przekazywanie jej do funkcji wstrzykiwania i przekazywanie $ resource. $ New() do mojego kontrolera.
  • Nic nie robiąc i mając nadzieję, że httpBackend zakryje to, ponieważ tak to ostatecznie zostanie wywołane. Vojta Jína sprawiła, że ​​brzmiało to tak, jakby to działało, ale bez kostki.
  • Łagodne epitety. Satysfakcjonujący, ale niezbyt skuteczny.

Odpowiedz

6

Po więcej czytania i więcej eksperymentowania wydaje właściwy sposób, aby to zrobić jest abstrakcyjne użycie $ zasobów z kontrolera. W moim przypadku napisałem usługę, która opiera się na $ resource, a następnie wprowadza tę usługę do mojego kontrolera. Tymczasem testuję tę usługę oddzielnie od kontrolera. Lepsza praktyka dookoła.

Moja deklaracja usługa:

angular.module('apiModule', ['localResource', 'ngCookies']) 
.factory('apiService', function($resource, $cookies) { 

iw moich testów jednostkowych mijam go przez w funkcji konfiguracji beforeEach

beforeEach(module('apiModule')); 
+19

Czy możesz udostępnić bardziej kompletny przykład kodu? Jako nowicjusz w Angular i Jasmine, mam problem z owinięciem głowy. –

+0

@akronym A więc włączyłeś 'app.js' do testowania kontrolera? – Deeptechtons

+10

Ale czy nie wystąpi taki sam problem podczas testowania usługi? –

6

Spróbuj instancję $resource z następującego kodu:

var $injector = angular.injector(['ng', 'ngResource']); 
var $resource = $injector.get('$resource'); 

Podobny do innych usług, z wyjątkiem, gdy są jeszcze w innych modułach. Następnie dodaj ten moduł do tablicy.

More info

+0

Może nie jestem zrozumienia coś tutaj. Próbowałem tego i otrzymałem ten sam rezultat. Zaktualizowałem mój pierwotny wpis, aby uwzględnić Twoją sugestię. – akronymn

+0

Okazuje się, że problem z tym rozwiązaniem polega na tym, że $ zasób w rzeczywistości nie jest usługą. To jest fabryka. http://docs.angularjs.org/api/ngResource.$resource – akronymn