2013-04-10 35 views
14

Tôi rất mới này (angularjs, hoa nhài, testacular) và tôi có mã này (tôi đơn giản hóa nó một chút, chỉ để lại những gì quan trọng):thử nghiệm AngularJS nhà máy chức năng với 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; 
    } 
]) 

Vì vậy, những gì Tôi muốn làm là kiểm tra nếu my_data.my_factory.save được gọi khi my_module.my_controller.my_function được kích hoạt.

//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(); 
    }); 
} 

Tôi cần một chút trợ giúp.

Trả lời

25

Bạn không quá xa những gì bạn cần. Trước hết, khi bạn yêu cầu my_data làm phụ thuộc my_module, bạn không cần phải tiêm my_module vào bộ điều khiển, chỉ cần nhà máy (my_factory);

Thứ hai, bạn muốn sử dụng ngMock. Các tài liệu không phải là rất đầy đủ, nhưng cung cấp cho một cái nhìn sâu sắc tốt. Thêm hereexample here (tìm kiếm test/unit/controllers).

Về cơ bản, những gì bạn muốn làm là giả lập dịch vụ để bạn có thể yên tâm rằng nó đã được gọi. Để đạt được điều này, hãy tiêm $provide vào cuộc gọi angular.mock.module của bạn và cung cấp dịch vụ my_factory được chế nhạo. Cách tốt nhất để đạt được nó là một cái gì đó như thế này:

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(); 
    }); 
} 

Bằng cách này bạn sẽ ghi đè phụ thuộc my_factory.

+0

Xin chào @CaioCunha .. Bạn đang kiểm tra bộ điều khiển nào? Bạn chỉ định nó ở đâu? Tôi thực sự thích cách tiếp cận này, và tôi đang tái cấu trúc lại thử nghiệm của mình nhưng tôi đã nghi ngờ điều này https://github.com/Ridermansb/listfy/blob/feature/create-a-new-product-%232/tests/components /homeControllerTest.js – ridermansb

Các vấn đề liên quan