如何测试使用Parse SDK的Angular Factory

时间:2014-10-10 15:07:30

标签: angularjs unit-testing parse-platform jasmine karma-runner

这是我的第一个问题。我会尽力做到最好。在发布

之前我搜索了很多

我正在开发一个依赖于Javascript ParseSDK的angularJS应用程序。 我最近确信自己会参加测试,所以我是初学者。

我有这个工厂UserFactory包装了SDK,所以一切都很干净,模块化Angular方式。即:SDK仅用于工厂(不是控制器或指令)。

它是这样的:

myModule.factory('UserFactory', ['$q', function($q){
    var User = Parse.User.extend({
      // Instance methods
    },{
      // static/class methods
      // Overrides Parse.User.current() to wrap current User in promise
      current: function(){
          var deferred = $q.defer();
          var currentUser = Parse.User.current();
          if(currentUser)
              deferred.resolve(currentUser);
          else
              deferred.reject("No current user");
          return deferred.promise;
      }
    });

    return User;
}]);

我的问题:如何测试UserFactory.current()知道它使用外部服务? 我已经研究过嘲笑Parse SDK,但不知道怎么做,因为它与角度无关(即:不能使用httpBackend)。

我当前的测试文件:

describe("Unit: UserFactory", function(){
    var UserFactory;

    beforeEach(function(){
      module("myModule");
      inject(function(_UserFactory_){
          UserFactory = _UserFactory_;
      });
    });

    it("should return current User", function(){
      // What to expect ?
    });
});

提前谢谢

1 个答案:

答案 0 :(得分:1)

describe("Unit: UserFactory", function(){
    var UserFactory;

    beforeEach(function(){
      module("myModule");
      inject(function(_UserFactory_){
          UserFactory = _UserFactory_;
          $rootScope  = _$rootScope_;
      });
    });

    describe('current()', function() {

      var successCallback, errorCallback;


      beforeEach(function() {
        successCallback = jasmine.createSpy('success');
        errorCallback   = jasmine.createSpy('error');
      });

      it("promise should resolve if Parse.User.current is truthy", function(){

        spyOn(Parse.User, 'current').and.returnValue(true);

        UserFactory.current().then(successCallback, errorCallback);

        $rootScope.$digest();

        expect(successCallback.calls.count()).toBe(1);
        expect(errorCallback.calls.count()).toBe(0);

        expect(Parse.User.current).toHaveCalledOnce();

      });

      it("promise should reject if Parse.User.current is falsy", function(){

        spyOn(Parse.User, 'current').and.returnValue(false);

        UserFactory.current().then(successCallback, errorCallback);

        $rootScope.$digest();

        expect(errorCallback.calls.count()).toBe(1);
        expect(successCallback.calls.count()).toBe(0);

        expect(Parse.User.current).toHaveCalledOnce();

      });


    });

});