茉莉测试AngularJS工厂函数 [英] Test AngularJS factory function with Jasmine

查看:124
本文介绍了茉莉测试AngularJS工厂函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很新的这(angularjs,茉莉,testacular),我有这个code(我简化了一点,只留下哪些事项):

I am very new to this (angularjs, jasmine, testacular) and I have this code (I simplified it a bit, leaving only what matters):

//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被调用。

So, what I want to do is to test if my_data.my_factory.save is called when the my_module.my_controller.my_function is fired.

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

我需要一点点帮助。

I need a little bit of help.

推荐答案

您是来自你所需要的不是太远。首先,根据您的需要 my_data my_module 的依赖,你并不需要注入 my_module 到控制器,刚出厂( my_factory );

You're not too far from what you need. First off, as you require my_data as my_module dependency, you don't need to inject my_module to the controller, just the factory (my_factory);

其次,要充分利用 ngMock 的。该文档是不是很完整,但提供一个良好的洞察力。这里更多和的例如这里(寻找测试/单位/控制器)。

Secondly, you want to make use of ngMock. The docs are not very complete, but give a good insight. More here and a example here (look for test/unit/controllers).

基本上,你想要做的是嘲笑服务,让你可以放心它被调用。为了实现这一目标,注入 $提供你的 angular.mock.module 呼叫,并提供了一​​个嘲笑 my_factory 服务。实现这一目标的最好方法是这样的:

Basically, what you want to do is to mock the service so you can be assured it has been called. To achieve it, inject $provide to your angular.mock.module call and provide a mocked my_factory service. The best way to achieve it is something like this:

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 依赖。

This way you'll override my_factory dependency.

这篇关于茉莉测试AngularJS工厂函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆