2014-09-25 58 views
6

嘗試在Karma中使用AngularMock進行單元測試,如果我的函數已返回被拒絕的承諾,但似乎無法在此問題上找到任何令人驚訝的承諾。AngularJS/Karma - 測試函數返回已解決或拒絕的承諾

我有一個像UserService,其中有一個功能的服務:processIdentityResponse它返回一個承諾,是解決或否決取決於邏輯裏:

processIdentityResponse: function(response) 
{ 
    var deferred = $q.defer(); 
    if (response.data.banned) { 
     deferred.reject(response); 
    } else { 
     deferred.resolve(response); 
    } 
    return deferred.promise; 
} 

我想測試,如果禁止屬性存在那麼被拒絕的承諾將被退回,如果沒有,則會被解決......我如何實現這一目標?

我試着像下面沒有成功:

it('should return a rejected promise if status is a string', function() { 
    var rejected = false; 
    UserService.processIdentityResponse(data).catch(function() { 
     rejected = true; 
    }); 
    expect(rejected).toBe(true); 
}); 

回答

6

這似乎是原因是因爲承諾尚未得到解決,因爲它是異步功能。

你基本上要$rootScope.$digest()事後,像這樣:

it('should return a rejected promise if status is a string', inject(function($rootScope) { 
    var rejected = false; 
    UserService.processIdentityResponse(data).catch(function() { 
     rejected = true; 
    }); 
    $rootScope.$digest(); 
    expect(rejected).toBe(true); 
})); 
+0

我覺得在服務上使用範圍非常奇怪。它似乎保留給指令和控制器。 – trysis 2015-03-23 18:43:55

+0

@trysis你會如何測試承諾?我很樂意看到沒有調用'$ rootScope的方式。$ digest()' – 2015-07-31 13:40:23

+0

我並不是在辯論有用性或必要性,只是說它看起來很奇怪。服務應該與DOM邏輯完全隔離,'$ scope' /'$ rootScope'與DOM相關,儘管他們的一些方法,比如'$ digest',並不需要。 – trysis 2015-07-31 13:53:55

1

要添加到什麼多米尼克說,我用Jasiminedone()異步支持功能。把它看作暫停/等待功能。

describe('my description',function(){ 
beforeEach(function(done){ 
    var rejected = true; 
    var promise = UserService.processIdentityResponse(data);//add ur service or function that will return a promise here 
    setTimeout(function(){done();},1500);//set time to 1500ms or more if it's a long request 
}); 

it('it should be true',function(done){ 
    promise.catch(function(){ rejected=true}); 
    $rootScope.$digest();//important 
    expect(rejected).toBeTruthy(); 
    done(); 
}); 
});