2013-04-13 14 views
40

के रूप में हम http://docs.angularjs.org/tutorial/step_07 में यहाँ देख,AngularJS मार्ग इकाई परीक्षण

angular.module('phonecat', []). 
    config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
     when('/phones', {templateUrl: 'partials/phone-list.html', controller: PhoneListCtrl}). 
     when('/phones/:phoneId', {templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl}). 
     otherwise({redirectTo: '/phones'}); 
}]); 

मार्ग परीक्षण E2E परीक्षण के साथ किया जा करने के लिए सुझाव दिया है,

it('should redirect index.html to index.html#/phones', function() { 
    browser().navigateTo('../../app/index.html'); 
    expect(browser().location().url()).toBe('/phones'); 
    }); 

हालांकि, मुझे लगता है कि '$ routeProvider' config है एक फ़ंक्शन, फ़ंक्शन ($ रूटप्रोवाइडर) के साथ किया गया है, और हमें ब्राउज़र की भागीदारी के बिना इकाई परीक्षण करने में सक्षम होना चाहिए क्योंकि मुझे लगता है कि रूटिंग फ़ंक्शन को ब्राउज़र DOM की आवश्यकता नहीं है।

उदाहरण के लिए

,
जब यूआरएल है/foo, templateUrl /partials/foo.html होना चाहिए और नियंत्रक जब यूआरएल/बार है, templateUrl /partials/bar.html होना चाहिए और नियंत्रक है BarCtrl

FooCtrl
है

यह एक साधारण कार्य आईएमओ है, और इसे एक परीक्षण परीक्षण, एक यूनिट परीक्षण में भी परीक्षण किया जाना चाहिए।

मैंने इस $ रूटप्रोवाइडर यूनिट परीक्षण के लिए गुगल किया और खोज की, लेकिन अभी तक कोई भाग्य नहीं है।

मुझे लगता है कि मैं यहां से कुछ कोड उधार ले सकता हूं लेकिन इसे अभी तक नहीं बना सकता, https://github.com/angular/angular.js/blob/master/test/ng/routeSpec.js

+0

2 में से कोई भी पर्याप्त नहीं है? – Maarten

+0

किसी को यह आश्चर्य करना होगा कि क्या यह एक यूनिट परीक्षण उत्पन्न करेगा जो वास्तविक मूल्य प्रदान करता है, हालांकि; अधिकांश मार्ग कॉन्फ़िगरेशन बस इतना है, कॉन्फ़िगरेशन, और यूनिट टेस्ट 'क्या/कुछ/मार्ग बराबर/कुछ/मार्ग' तक उबाल जाएगा? – fwielstra

+1

@fwielstra, हां, इस प्रकार का परीक्षण [डबल एंट्री] (http://en.wikipedia.org/wiki/Double-entry_bookkeeping_system) जैसा लगता है। फिर फिर, मुझे लगता है कि अधिकांश परीक्षण इस तरह महसूस करते हैं। दूसरी तरफ, मुझे डबल एंट्री उपयोगी लगता है। – zhon

उत्तर

62

क्यों न सिर्फ जोर मार्ग वस्तु ठीक से कॉन्फ़िगर किया जाता है?

it('should map routes to controllers', function() { 
    module('phonecat'); 

    inject(function($route) { 

    expect($route.routes['/phones'].controller).toBe('PhoneListCtrl'); 
    expect($route.routes['/phones'].templateUrl). 
     toEqual('partials/phone-list.html'); 

    expect($route.routes['/phones/:phoneId'].templateUrl). 
     toEqual('partials/phone-detail.html'); 
    expect($route.routes['/phones/:phoneId'].controller). 
     toEqual('PhoneDetailCtrl'); 

    // otherwise redirect to 
    expect($route.routes[null].redirectTo).toEqual('/phones') 
    }); 
}); 
+1

जब मैं राउटर का परीक्षण करने की कोशिश करता हूं तो मुझे "अपरिभाषित" प्राप्त नहीं होता है (अंतिम मार्ग के लिए '$ rout.routes [null] .redirectTo' का मूल्यांकन करना) "उम्मीद ($ rout.routes [null]। रीडायरेक्ट करने के लिए) .toEqual ('/ phone') " – Brune

+13

यह मेरे लिए एक सुंदर बेकार परीक्षण जैसा दिखता है। दूसरों द्वारा प्रस्तावित शैली बेहतर नहीं है। –

+2

यह जांच नहीं करेगा कि राज्य के मार्गों के आधार पर उपलब्ध/कॉलबे उपलब्ध हैं। उदाहरण के लिए, यह इस मामले को कैसे कवर करता है "मैं लॉग इन नहीं हूं और प्रतिबंधित संसाधन तक पहुंचने का प्रयास करता हूं"? –

45

मुझे लगता है कि आप इस तरह से $ routeProvider परीक्षण करने के लिए सक्षम होना चाहिए:

angular.module('phonecat', []). 
    config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
     when('/phones', {templateUrl: 'partials/phone-list.html', controller: PhoneListCtrl}). 
     when('/phones/:phoneId', {templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl}). 
     otherwise({redirectTo: '/phones'}); 
}]); 


it('should test routeProvider', function() { 
    module('phonecat'); 

    inject(function($route, $location, $rootScope) { 

    expect($route.current).toBeUndefined(); 
    $location.path('/phones/1'); 
    $rootScope.$digest(); 

    expect($route.current.templateUrl).toBe('partials/phone-detail.html'); 
    expect($route.current.controller).toBe(PhoneDetailCtrl); 

    $location.path('/otherwise'); 
    $rootScope.$digest(); 

    expect($location.path()).toBe('/phones/'); 
    expect($route.current.templateUrl).toEqual('partials/phone-list.html'); 
    expect($route.current.controller).toBe(PhoneListCtrl); 

    }); 
}); 
+2

यह सही है। '$ rootScope। $ digest() 'बिल्कुल वही था जो मुझे चाहिए था। – marcoseu

+0

यह परीक्षण अब काम नहीं करता है ... – wakandan

+1

यह काम नहीं करता है क्योंकि कोणीय अजाक्स के माध्यम से टेम्पलेट को पुनर्प्राप्त करने के लिए एक HttpBackend कॉल ट्रिगर करना चाहता है ... इस के ऊपर समाधान (zhon से) हालांकि काम करता है! – alchemication

4

दो पिछले जवाब का मेल, आप एक ब्लैक बॉक्स है कि सफलतापूर्वक मार्ग यह होना चाहिए (नहीं अपने आप में नियंत्रक ETS कॉन्फ़िगरेशन) जहां, जो कुछ भी हो सकता है मार्गों के रूप में रूटर का परीक्षण करना चाहते हैं:

// assuming the usual inject beforeEach for $route etc. 
var expected = {}; 
it('should call the right controller for /phones route', function() { 
    expected.controller = $route.routes['/phones'].controller; 
    $location.path('/phones'); 
    $rootScope.$digest(); 
    expect($route.current.controller).toBe(expected.controller); 
}); 

it('should redirect to redirectUrl from any other route', function() { 
    expected.path = $route.routes[null].redirectTo; 
    $location.path('/wherever-wrong'); 
    $rootScope.$digest(); 
    expect($location.path()).toBe(expected.path); 
}); 
संबंधित मुद्दे