2014-10-10 82 views
2

这是我的第一个问题。我会尽力做到最好。我在发帖之前搜索了很多如何测试使用Parse SDK的Angular工厂

我正在开发一个依赖于Javascript ParseSDK的angularJS应用程序。 我已经说服自己最近在测试中潜水,所以我是初学者。

我有这个工厂UserFactory围绕SDK,所以一切都干净,模块化的角度的方式。即: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()知道它使用外部服务? 我研究过嘲笑解析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 ? 
    }); 
}); 

预先感谢您

+0

我最常做的,在这种情况下,被嘲讽'Parse.User.current()',使它返回我选择的值,然后在调用后比较这个值,确保它调用了这个方法(与一些间谍一起)。 – GeoffreyB 2014-10-10 15:12:54

回答

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

     }); 


    }); 

}); 
+0

谢谢,让我走在正确的轨道。我仍然有问题。 'spyOn(Parse.User,“current”)'抛出**无法读取属性'returnValue'undefined ** – 2014-10-11 10:36:06

+0

好的,我错了茉莉花/卡玛茉莉花的版本。它适用于2_0分支 – 2014-10-13 09:42:00