2017-01-25 22 views
9

मैं इस तरह एक नमूना मार्ग है:कोणीय जे एस परीक्षण

angular 
     .module('appRouter',['ui.router']) 
     .config(function($stateProvider,$urlRouterProvider){ 
      $stateProvider 
       ..... 
       ..... 
       .state('settings.account',{ 
        url:'/account', 
        templateUrl:'templates/account.html', 
        controller:function(resolveData){ 
         console.log(resolveData); 
        }, 
        resolve:{ 
         resolveData : function($http){ 
          var root = 'https://jsonplaceholder.typicode.com'; 
          return $http.get(root+'/posts/1').then(function(response){ 

           return response.data; 
          }); 
         } 
        } 
       }); 

      ..... 

यह सिर्फ एक परीक्षण यूआरएल है जहाँ मैं ऑनलाइन

https://jsonplaceholder.typicode.com/posts/1

नमूना JSON डेटा प्राप्त कर सकते हैं

मैं राज्य का परीक्षण करना चाहता था।

beforeEach(function(){ 
     module('appRouter'); 
    }); 

    beforeEach(inject(function(_$rootScope_,_$injector_,_$state_,_$httpBackend_,$templateCache){ 
     $rootScope = _$rootScope_; 
     $state = _$state_; 
     $injector = _$injector_; 
     $httpBackend = _$httpBackend_; 
     $templateCache.put('templates/account.html',''); 
    })); 

    it('should resolve "resolveData"',function(){ 
     const state = $state.get('settings.account'); 
     const resolveFn = state.resolve.resolveData; 

       $httpBackend.whenGET('https://jsonplaceholder.typicode.com/posts/1').respond(function(){ 
     return [ 
      200,{ 
       "userId": 1, 
       "id": 1, 
       "title": "...", 
       "body": "..." 
     }] 
    }); 

    $httpBackend.expectGET('https://jsonplaceholder.typicode.com/posts/1'); 

    $injector.invoke(resolveFn); 

    $httpBackend.flush(); 

    expect($injector.annotate(resolveFn)).toEqual(['$http']); 

    console.log(angular.mock.dump($scope)); 

    expect($scope.resolveData).toEqual({ 
     "userId": 1, 
     "id": 1, 
     "title": "...", 
     "body": "..." 
    }); 

लेकिन यह विफल रहता है।

1) should resolve "resolveData" 
    UI Routerer Config For Account 
    Expected undefined to equal Object({ userId: 1, id: 1, title: '...', body: '...' }). 
    at Object.<anonymous> (test/controllers/main-controller-spec.js:114:36) 

मैं क्या गलत कर रहा हूं?

अद्यतन

console.log(angular.mock.dump($scope)); देता है निम्नलिखित

enter image description here

कृपया मदद करते हैं।

+0

मुझे लगता है कि मूल त्रुटि के साथ आपके द्वारा पूछे गए मूल प्रश्न (संपादन से पहले) में मूल्य था। यह नया त्रुटि संदेश एक नया सवाल होना चाहिए।वे दोनों अलग-अलग समस्याएं हैं, जिन्हें व्यक्तिगत रूप से संभाला जाना चाहिए। –

+2

मैं समझ नहीं पा रहा हूं कि आप यहां परीक्षण करने की कोशिश कर रहे हैं। मेरा मतलब है: परीक्षणों की जांच करनी चाहिए कि क्या आपका कोड कुछ तर्क कर रहा है, जिसे आप उम्मीद करते हैं। लेकिन इसके बजाय (जहां तक ​​मैं देख सकता हूं) आपकी परीक्षा जांचती है कि क्या आप कुछ अनुरोध से कुछ जेसन प्राप्त कर सकते हैं। परीक्षण का उद्देश्य नहीं है। हो सकता है कि यह सर्वर साइड टेस्ट का अच्छा उद्देश्य हो। इसके बजाए मैं आपको "समाधान" के अंदर कुछ सेवा कॉल करने का सुझाव देता हूं (बस कुछ सेवा इंजेक्शन करके $ http कॉल को प्रतिस्थापित करें और इसकी विधियों में से एक को कॉल करें), अब आप परीक्षण कर सकते हैं कि "state.go" के जवाब में ifs सेवा कहलाती है, और अगर सेवा को सही पैरा के साथ बुलाया जाता है। (मेरी राय है) – happyZZR1400

उत्तर

1
should resolve "resolveData" 
UI Routerer Config For Account 
TypeError: Cannot read property 'get' of undefined 
at resolveData (app/appRouter.js:25:41) 
at Object.<anonymous> (test/controllers/main-controller-spec.js:97:9) 

इस समस्या को हल करने के लिए आपको $http कोडाटा फ़ंक्शन को हल करने के लिए पास करना चाहिए।

resolveFn($http); 

लेकिन यह this

+0

क्षमा करें, लेकिन यह कहता है 'संदर्भ त्रुटि: $ http परिभाषित नहीं किया गया है'। कृपया इसे देखें। – StrugglingCoder

+0

हां आपको अपने परीक्षण – fingerpich

+0

में $ http इंजेक्ट करना होगा मैंने ऐसा किया था। और मैंने जो त्रुटि का उल्लेख किया वह कहने में असफल रहा। कैसे उबरना है? – StrugglingCoder

2

मूल त्रुटि की तरह परीक्षण लिखने के लिए बेहतर है:

should resolve "resolveData" 
UI Routerer Config For Account 
TypeError: Cannot read property 'get' of undefined 
    at resolveData (app/appRouter.js:25:41) 
    at Object.<anonymous> (test/controllers/main-controller-spec.js:97:9) 

What am I doing wrong?

आप अपने इकाई परीक्षण में resolveFn() बुला रहे हैं। फ़ंक्शन को $http सेवा की आवश्यकता के रूप में परिभाषित किया गया था, और वह कॉल $http सेवा (fingerpich उल्लेख के रूप में) पास नहीं करता है।

इसे ठीक करने के लिए, कोणीय को $injector.invoke(resolveFn) का उपयोग करके निर्भरता इंजेक्शन को संभालने की अनुमति दें।

इसे plunk के साथ कार्रवाई में देखें। ध्यान दें कि परीक्षण एक अलग कारण के लिए विफल रहता है। लेकिन, (यदि मैं नियमों को सही ढंग से समझता हूं) तो एक अलग मुद्दे का उत्तर एक अलग प्रश्न के साथ दिया जाना चाहिए (यदि आपको और सहायता चाहिए)।

एक साइड नोट: जब ब्राउज़र में साइट (यूनिट टेस्ट नहीं) खोला जाता है, तो मैं इसे काम करने की उम्मीद करता हूं, क्योंकि कोणीय पर दिए गए फ़ंक्शन में $http निर्भरता इंजेक्ट करता है।

answer पर देखें जो fingerpich द्वारा उल्लिखित ब्लॉग का भी संदर्भ देता है।

unit testing AngularJS के बारे में सीखते समय मुझे एक ब्लॉग मिला है।

+0

मैंने कोशिश की लेकिन यह मेरे लिए काम नहीं कर सका। यह कहा गया है कि 'ऑब्जेक्ट के बराबर अपरिभाषित ({userId: 1, id: 1, title: ...' जब मैं JSON डेटा से मेल खाने के लिए '$ scope.resolveData' की अपेक्षा करता हूं। मैं गलत क्या कर रहा हूं? – StrugglingCoder

+0

क्या आपको अभी भी प्राप्त होता है त्रुटि 'को हल करना चाहिए "संकल्पडेटा" ... TypeError: अपरिभाषित संपत्ति' प्राप्त 'नहीं पढ़ सकता ... '? यदि नहीं, तो आपका मूल प्रश्न हल किया जाना चाहिए और टिप्पणी में उल्लिखित त्रुटि एक नए प्रश्न के तहत आ जाएगी। –

+0

शायद एक छोटी सी नई नई त्रुटि के साथ मदद करेगी: 'console.log (angular.mock.dump ($ स्कोप)) जोड़ें;' परीक्षण के अंत में 'उम्मीद' कथन से पहले। उसके बाद, चेकआउट कैसे ' .then() '' $ injector.invoke() 'कॉल [यहां] के साथ प्रयोग किया जाता है (http://stackoverflow.com/questions/29080657/testing-ui-router-stateprovider-resolve-values/29128751#29128751) (मैंने इस लिंक को मेरे उत्तर में शामिल किया है) –

संबंधित मुद्दे