我想確保我的單元測試用例覆蓋了永不解決的承諾的情況,並且我遇到了一些問題。噶角單元測試一個承諾永遠不會被解決
代碼塊是勝過千言萬語,所以..
it('returns my resource', function() {
var myUser = {name:'Bob'}
$httpBackend.expectGET('/myresource').respond(200,myUser);
myService.getMyUser()
.then(function(data) {
expect(data).toEqual(myUser);
},fail);
});
這是一切都很好,和試驗響應是預期,也未能通過測試應許被拒絕。
但是,如果承諾永遠無法解決,測試通過,我希望它失敗。我在爲myService緩存此請求,像這樣:在上述情況下
var cachedUser;
function getMyUser(forceUpdate) {
var deferred = $q.defer();
if (cachedUser && !forceUpdate) {
deferred.resolve(cachedUser);
} else {
$http.get('/myresource')
.then(function(data) {
cachedUser = data;
deferred.resolve(data);
},function(error) {
deferred.reject(error);
});
}
return deferred.promise;
}
現在,如果一個人請從$ http.get內行「deferred.resolve(data)
」,測試仍然會通過。這是因爲包含期望data.toEqual(myUser)
的回調函數從未運行。但是,測試應該失敗,因爲刪除該行會破壞此功能的用途。
我已經嘗試在測試代碼中使正面回調一個間諜,並希望間諜toHaveBeenCalled,但似乎運行之前承諾解決並失敗,即使我可以看到間諜的功能通過控制檯日誌。
我也在單元測試中嘗試將承諾放在一個變量中,然後expect(promise.$$state.status).toEqual(1)
,但似乎這個期望是在承諾解決之前運行的,所以測試失敗時應該通過。
請確保您在回答之前瞭解問題,如果我不清楚,請發表評論。
是的,它實際上ISN」不要清楚確切的問題是什麼。問題中沒有單個問號。另外,*單元測試的意義永遠不會被解析*短語也不清楚。 – estus
現在的問題是如何確保單元測試涵蓋.a承諾永遠不會解決的情況,這與被拒絕 – ErikAGriffin