2014-05-07 11 views
5

के साथ इकाई परीक्षण सेवा को हल करने का वादा नहीं करता है, मैं एक कोणीय.जेएस सेवा का परीक्षण करने की कोशिश कर रहा हूं, और एक नकली सेवा (जैस्मीन का उपयोग करके) से लौटाए गए वादे पर एक अपेक्षा निर्धारित करने की आवश्यकता है। मैं कर्म इकाई परीक्षण ढांचे का उपयोग कर रहा हूँ। प्रासंगिक कोड का टुकड़ा नीचे है:Angular.js कर्मा

// I can't figure out how to do the equivalent of a $scope.$digest here. 
var loginStatusPromise = FacebookService.getFacebookToken(); 
loginStatusPromise.then(function(token) { 
    expect(false).toBeTruthy(); // If this test passes, there is something going wrong! 
    expect(token).not.toBeNull(); // The token should be ValidToken 
    expect(token).toBe('ValidToken'); 
}); 

पूर्ण इकाई परीक्षण कोड here देखा जा सकता है।

समस्या यह वादा है। जब कर्मा निष्पादित हो रहा है तो कथित तौर पर कथन नहीं होता है। इसलिए, मेरे उम्मीदवारों में से कोई भी कथन निष्पादित नहीं किया जाता है। मेरे नियंत्रक परीक्षणों में, मैं वादे को हल करने के लिए $ scope। $ Digest() का उपयोग करता हूं, लेकिन मुझे यह नहीं पता कि सेवा परीक्षण में इसे कैसे किया जाए। जैसा कि मैंने सोचा था कि सेवा परीक्षण में 'स्कोप' की कोई धारणा नहीं थी।

क्या मेरे पास छड़ी का गलत अंत है? क्या मुझे अपने सर्विस टेस्ट में $ रूटस्कोप को इंजेक्ट करने की आवश्यकता है और फिर $ पाचन का उपयोग करें? क्या कोई और तरीका है?

+0

मेरे उत्तर पर कोई प्रतिक्रिया? –

+0

हां, नीचे देखें। $ RootScope को कॉल करना। $ Digest() या तो काम नहीं कर रहा है। यहां कुछ और खेलना है। अद्यतन कोड से लिंक नीचे दिखाया गया है। – Bradley

उत्तर

2

मान लें कि आप ngFacebook/ngModule का उपयोग कर रहे हैं समाधान/विचारों से पहले एक त्वरित नोट यह है कि इस परियोजना में यूनिट परीक्षण नहीं हैं! क्या आप वाकई इस परियोजना का उपयोग करना चाहते हैं?

मैं Github पर अपने यूनिट टेस्ट के एक त्वरित स्कैन किया था और लापता निम्नलिखित पाया: -

1) मॉड्यूल आरंभीकरण। ngFacebook की आवश्यकता है या आपको अपने मॉड्यूल को प्रारंभ करने की आवश्यकता है जो वही काम करता है।

beforeEach(module('ngFacebook')); 

या

beforeEach(module('yieldtome')); 

2) गंभीरता से ngFacebook मॉड्यूल

मजाक इकाई स्तर परीक्षण में आप एक मज़ाक उड़ाया बुलबुला जहां बाहर इंटरफेस बाहर टोंटदार कर रहे हैं के भीतर अपने कोड का परीक्षण पर विचार करें।

अन्यथा) के रूप में नीचे एपीआई बुला जोड़ने का प्रयास करें: -

$rootScope.$apply(function() { 
    this.FacebookService.getFacebookToken().then(function(){ 
     //your expect code here 
    }); 
    }); 
$httpBackend.flush();//mock any anticipated outgoing requests as per [$httpBackend][2] 
1
beforeEach(function(){ 
    var self=this; 
    inject(function($rootScope,Facebook){ 
     self.$rootScope=$rootScope; 
     self.Facebook=Facebook; 
    }); 
}) 

it('resolves unless sourcecode broken',function(done){ 
    // I can't figure out how to do the equivalent of a $scope.$digest here. 
    var loginStatusPromise = this.FacebookService.getFacebookToken(); 
    loginStatusPromise.then(function(token) { 
     expect(token).toBe('ValidToken'); 
     done(); 
    }); 
    $rootscope.$apply(); 

}); 

https://docs.angularjs.org/api/ng/service/$q

+0

दुर्भाग्य से यह दृष्टिकोण या तो काम नहीं करता है। फिर फ़ंक्शन नहीं कहा जाता है, हिट नहीं किया जाता है। – Bradley

+0

तो आपका कोड टूटा हुआ है, हमें फेसबुक सेवा – mpm

+1

दिखाएं यदि यह टूटा हुआ है- तो यह इस तरह से टूटा हुआ है कि यह वास्तविक ऐप में काम करता है, लेकिन केवल इकाई परीक्षण/कर्म में चलने पर ही टूट जाता है। फेसबुक सेवा कोड [यहां] (https://github.com/bradleyscott/yieldtome/blob/master/Web/app/js/services/facebookService.js) पर देखा जा सकता है और आप वहां बाकी रेपो ब्राउज़ भी कर सकते हैं अगर ऐसी अन्य फाइलें हैं जिन्हें आप – Bradley

7

मैं इस समस्या थी और केवल अपने परीक्षण

आपका FacebookService समस्या हो सकती है के अंत में एक $rootScope.$apply() डाल, के रूप में @mpm ने सुझाव दिया द्वारा यह संकल्प लिया। क्या आप सुनिश्चित हैं कि उसके पास Facebook निर्भरता के अंदर कोई भी http कॉल नहीं हो रहा है जो यूनिट परीक्षण के दौरान नहीं होगा? क्या आप निश्चित हैं कि अभी तक स्थगित पर resolve कहा गया है?

+2

'$ rootScope डालकर $ $ लागू करें()' वादे के बाद सही। (ओं) ने मुझे इसी तरह के मामले में मदद की। AngularJS वादे केवल '$ digest' लूप के अगले पुनरावृत्ति में आग लगते हैं, जो स्वचालित रूप से इस तरह के यूनिट परीक्षण में ट्रिगर नहीं हो सकता है। – johsin18

0

मैं ऊपर जवाब है कि एक सेवा $rootScope के साथ कुछ नहीं करना चाहिए था के साथ सहमत हैं।

मेरे मामले में $q वादा था, जो आंतरिक रूप से एक वादे को हल करने वाली दूसरी सेवा का उपयोग करता था। बाहरी को हल करने का कोई तरीका नहीं, जब तक कि मैंने अपने सेवा कोड में (0 परीक्षण नहीं) $rootScope.$digest() जोड़ा ...

मैंने अपने परीक्षणों में उपयोग करने के लिए $q के लिए इस त्वरित शिम को लिखना समाप्त कर दिया, लेकिन सावधान रहें, क्योंकि यह सिर्फ एक उदाहरण है और पूर्ण $q कार्यान्वयन नहीं है।

beforeEach(module(function($provide) { 
    $provide.value('$q', { 
    defer: function() { 
     var _resolve, _reject; 
     return { 
     promise: { 
      then: function (resolve, reject) { 
      _resolve = resolve; 
      _reject = reject; 
      } 
     }, 
     resolve: function (data) { 
      window.setTimeout(_resolve, 0, data); 
     }, 
     reject: function (data) { 
      window.setTimeout(_reject, 0, data); 
     } 
     }; 
    } 
    }); 
})); 

आशा है कि यह किसी के लिए उपयोगी होगा, या यदि आपके पास कोई प्रतिक्रिया है।

धन्यवाद।