2013-04-10 14 views
14

Jestem bardzo nowy na tym (angularjs, jaśmin, testacular) i mam ten kod (I uproszczone go trochę, pozostawiając tylko to, co ma znaczenie):testowe angularjs funkcja fabryka z Jasmine

//my_module.js 
angular.module('my_module', ['my_data']) 
.config([...]); 

.controller('my_controller', ['$scope', 'my_data', 
    function($scope, my_data) { 
     $scope.my_function = function() { 
      return my_data.my_factory.save().then(function() { 
       console.log('saved'); 
      }, 
      function() {        
       console.log('Error'); 
      }); 
     } 
    } 
) 

//my_data.js 
angular.module('my_data', []) 
.factory('my_factory', ['$q', '$rootScope', 
    function($q, $rootScope) { 
     var my_factory= function(my_data) { 
      angular.extend(this, my_data); 
     } 
     my_factory.prototype.save = function() { 
      var deferred = $q.defer(); 
      setTimeout(function() { 
       deferred.resolve(); 
      $rootScope.$apply(); 
      }, 1000); 

      return deferred.promise; 
     } 
     return my_factory; 
    } 
]) 

Więc, co Chcę zrobić to sprawdzić, czy moje_data.my_factory.save jest wywoływana, gdy uruchomiona jest funkcja my_module.my_controller.my_function.

//my_test.js 
describe('testing my_controller.my_function', function() { 
    beforeEach(module('my_module')); 

    var $rootScope, $controller; 
    beforeEach(inject(function(_$rootScope_, _$controller_) { 
     $rootScope = _$rootScope_; 
     $controller = _$controller_; 
    })); 

    scope = $rootScope.$new(); 

    it('should call the save function', function() { 
     scope.my_function(); 
     expect(my_data.save).toHaveBeenCalled(); 
    }); 
} 

Potrzebuję trochę pomocy.

Odpowiedz

25

Nie jesteś zbytnio od tego, czego potrzebujesz. Po pierwsze, ponieważ wymaga się zależności od my_data jako my_module, nie trzeba wprowadzać my_module do sterownika, tylko do fabryki (my_factory);

Po drugie, chcesz skorzystać z ngMock. Dokumenty nie są kompletne, ale dają dobry wgląd. Więcej here i example here (poszukaj test/unit/controllers).

Zasadniczo, to, co chcesz zrobić, to kpić z usługi, aby można było mieć pewność, że została wywołana. Aby to osiągnąć, należy wprowadzić $provide do połączenia angular.mock.module i podać wyśmiewaną usługę my_factory. Najlepszym sposobem, aby to osiągnąć jest coś takiego:

describe('testing my_controller.my_function', function() { 
    var mockedFactory, $rootScope, $controller; 

    beforeEach(module('my_module', function($provide) { 
    mockedFactory = { 
     save: jasmine.createSpy() 
    }; 

    $provide.value('my_factory', mockedFactory); 
    })); 

    beforeEach(inject(function(_$rootScope_, _$controller_) { 
    $rootScope = _$rootScope_; 
    $controller = _$controller_; 
    })); 

    scope = $rootScope.$new(); 

    it('should call the save function', function() { 
    scope.my_function(); 
    expect(mockedFactory.save).toHaveBeenCalled(); 
    }); 
} 

ten sposób będziesz zastąpić my_factory zależność.

+0

Cześć @CaioCunha .. Który kontroler testujesz? Gdzie to określasz? Podobało mi się to podejście, a ja refaktoryzuję to samo z mojego testu, ale mam tę wątpliwość https://github.com/Ridermansb/listfy/blob/feature/create-a-new-product-%232/tests/components /homeControllerTest.js – ridermansb

Powiązane problemy