2016-03-04 63 views
2

我在Jasmine中遇到了一些測試函數返回承諾的問題。這個解決方案非常接近我遇到的問題:How to resolve promises in AngularJS, Jasmine 2.0 when there is no $scope to force a digest?使用Jasmine 2.4返回承諾的測試服務*

該帖子是從2014年開始的,目前尚不清楚他們使用的是哪種版本的茉莉花。這仍然是正確的原因,爲什麼要測試一個解決在當前(2.4.0 ^)版本的承諾的函數?

編輯:

我有它的模式看起來像這樣的服務:

angular.module('somemodule').factory('listOfDependencies','NewService'); 
function NewService(listOfDependencies){ 
    var getObject = function(para1, para2,...,paraN){ 
    var deferred = $q.defer(); 
    if(someDependency.method()) 
     deferred.resolve(someDependency.get(key)); 
    else 
     deferred.resolve(returnsNewObject); 
    // there's also a case that returns deferred.reject(reason); 
    return deferred.promise; 
    }; 
    return getObject:getObject; 
    }; 

在我的規格,測試目前看起來是這樣的

 it('should return the object', inject(function() { 
      var obj = { some: Object }; 
      NewService.getObject('param1'...'paramN').then(
      function(data){ 
       expect(data.obj).toEqual(obj); 
      }, 
      function(response){ 
       //promise failed 
      });       

現在我期待基於對象'obj'應返回。在我的服務是這種情況下,按理應該返回」

if(someDependency.method()) 
     deferred.resolve(someDependency.get(key)); 

的問題是,是,它返回的對象是:

 else 
     deferred.resolve(returnsNewObject); 

沒有什麼不好的代碼或任何其依賴的邏輯(我把所有這些分開了,並且測試了很多次),所以我覺得我的語法(?)在茉莉花規範中有些問題,或者我只是沒有正確地測試諾言。謝謝你看看這個!

+0

請做一些小小的代碼來闡述 - 這個不清楚。 –

+0

當然!讓我知道如果您需要其他任何東西,當我發佈時,我只是不在我的代碼前面。 – arturobelano

回答

0

我解決了這個問題,通過調用$ rootScope。$ apply();在我的測試結束時。

0

解決承諾,然後檢查它解析的值有效和預期肯定是一種做法。

如果你確定使用的柴庫,它的很多更簡潔: http://chaijs.com/plugins/chai-as-promised/

爲了讓代碼更易於單元測試,嘗試在角服務做盡可能多的繁重的越好(而不是在控制器中),並且服務返回承諾。這樣,您的單元測試可以使用各種輸入調用服務方法,並確保承諾如預期般被拒絕/解決。

+0

是的,所以我在測試點,我仍然可以考慮另一個圖書館。柴比茉莉有什麼優勢嗎?或者是否需要根據項目需求/結構進行評估? – arturobelano

+0

我個人比較喜歡摩卡Chai + Sinon的角度發展。 Chai(與Chai-as-promised附加組件)有很大的承諾測試功能,而sinon提供了一個非常強大的框架來監視和存根後端API調用。 –