2014-10-10 18 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