2014-09-22 198 views
1

如何測試服務返回的承諾的值?$q documentation中,承諾值是在使用resolve(value)的測試中預設的。其他方法測試控制器中的服務邏輯,使用的事實是AngularJS評估承諾並將值綁定到$ scope。服務返回的測試承諾值

在我看來,這些方法都沒有在應該測試的地方實際測試服務的邏輯。我如何測試已解決的承諾(由服務返回)是否包含正確的值?

下面的例子:

myApp.service('service', function($q){ 
    var obj = {}; 
    obj.test = function() { 
     var deferred = $q.defer(); 
     deferred.resolve(false); 
     return deferred.promise; 
    } 
    return obj; 
}); 

爲了測試該服務,我想這樣做在理論上以下(不實際工作): 變量$ Q,服務;

beforeEach(function() { 
    module('myModule'); 
    service = $injector.get('service'); 
}); 

describe('...', function() { 
    it('Testing whether promise contains correct value', function() { 
     var myPromise = service.test(); 
     myPromise.then(function(value) { 
      expect(value).toBeFalsy(); 
     }); 
    }); 
}); 

回答

0

我相信你是以錯誤的方式注入服務。你必須使用下劃線符號。請參閱此鏈接。 http://nathanleclaire.com/blog/2014/04/12/unit-testing-services-in-angularjs-for-fun-and-for-profit/

所以,你的測試應該看起來像這樣。

var service;  
beforeEach(function() { 
    module('myModule'); 
    inject(function(_service_) { 
     service = _service_; 
    }); 
}); 


describe('...', function() { 
    it('Testing whether promise contains correct value', function() { 
     var myPromise = service.test(); 
     myPromise.then(function(value) { 
      expect(value).toBeFalsy(); 
     }); 
    }); 
}); 
+0

我同意我應該返回一個承諾(在原來的問題中改變了它),但是這仍然無法工作。 – bengro 2014-09-22 23:25:25

+0

您可以將您的測試的其他部分特別發佈到您設置測試的部分嗎? – 2014-09-23 05:11:49

+0

我已經更新了原始問題中的測試。 – bengro 2014-09-23 06:43:03