这是我的第一个问题。我会尽力做到最好。在发布
之前我搜索了很多我正在开发一个依赖于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 ?
});
});
提前谢谢
答案 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();
});
});
});