2017-06-13 97 views
0

我想確保我的單元測試用例覆蓋了永不解決的承諾的情況,並且我遇到了一些問題。噶角單元測試一個承諾永遠不會被解決

代碼塊是勝過千言萬語,所以..

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),但似乎這個期望是在承諾解決之前運行的,所以測試失敗時應該通過。

請確保您在回答之前瞭解問題,如果我不清楚,請發表評論。

+0

是的,它實際上ISN」不要清楚確切的問題是什麼。問題中沒有單個問號。另外,*單元測試的意義永遠不會被解析*短語也不清楚。 – estus

+0

現在的問題是如何確保單元測試涵蓋.a承諾永遠不會解決的情況,這與被拒絕 – ErikAGriffin

回答

0

問題的結果是,當處理$ httpBackend時,您必須刷新()後端請求才能通過。我在每個測試周圍的afterEach()塊中都這樣做,所以當試圖在測試塊內測試承諾的狀態時,承諾還沒有真正解決。

通過移動$httpBackend.flush()在單元測試中,許返回確實更新其狀態從0到1

這裏是最後的單元測試代碼:

it('returns my resource', function() { 
    var myUser = {name:'Bob'} 
    var promise; 
    $httpBackend.expectGET('/myresource').respond(200,myUser); 
    promise = myService.getMyUser() 
    .then(function(data) { 
     expect(data).toEqual(myUser); 
    },fail); 
    $httpBackend.flush(); 
    expect(promise.$$state.status).toEqual(1); 
}); 
+1

承諾是不同的。$$ state.status斷言實際上是不必要的。實際的問題是缺少'$ rootScope。$ digest()'。這使得'then'部分永遠不會運行。 'flush()'也是'$ digest()',這就是它開始工作的原因。每個$ q promise鏈應該在測試中以'$ rootScope。$ digest()'結尾。我會建議使用https://github.com/bvaughn/jasmine-promise-matchers來保證它的安全性和一致性。 – estus