加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

单元测试 – 使用Jasmine测试AngularJS工厂功能

发布时间:2020-12-17 07:43:21 所属栏目:安全 来源:网络整理
导读:我对这个很新(有角度,茉莉花,testacular),我有这个代码(我简化了一点,只留下重要的): //my_module.jsangular.module('my_module',['my_data']).config([...]);.controller('my_controller',['$scope','my_data',function($scope,my_data) { $scope.my_funct
我对这个很新(有角度,茉莉花,testacular),我有这个代码(我简化了一点,只留下重要的):
//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_data.my_factory.save是否在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();
    });
}

我需要一点帮助.

你离你所需要的不远.首先,因为你需要my_data作为my_module依赖关系,所以你不需要把my_module注入到控制器中,就是工厂(my_factory);

其次,您想使用ngMock.文档不是很完整,但给出了很好的见解.更多here和example here(查找测试/单位/控制器).

基本上,你想做的就是模拟这个服务,所以你可以放心它已被调用.为了实现它,将$提供给您的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依赖关系.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读