使用 Jasmine 测试 AngularJS 工厂函数

2024-02-13

我对此非常陌生(AngularJS,茉莉花,睾丸),我有这个代码(我简化了一点,只留下重要的部分):

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

所以,我想做的是测试当 my_module.my_controller.my_function 被触发时是否调用 my_data.my_factory.save 。

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

我需要一点帮助。


你离你需要的并不太远。首先按照你的要求my_data as my_module依赖,不需要注入my_module对于控制器来说,只是工厂(my_factory);

其次,你想利用ngMock http://docs.angularjs.org/guide/dev_guide.unit-testing。这些文档不是很完整,但提供了很好的见解。更多的here http://docs.angularjs.org/api/angular.mock.inject and a 例子在这里 https://github.com/mhevery/foodme(寻找test/unit/controllers).

基本上,您想要做的是模拟该服务,以便您可以确信它已被调用。为了实现它,注入$provide给你的angular.mock.module打电话并提供一个嘲笑my_factory服务。实现它的最好方法是这样的:

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

这样你就可以覆盖my_factory依赖性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Jasmine 测试 AngularJS 工厂函数 的相关文章

随机推荐