2014-10-24 7 views
5

मैं कोड के लिए परीक्षण लिखने की कोशिश कर रहा हूं जिसे मैंने लिखा नहीं है जो यूई-राउटर का उपयोग करता है।कोणीय जेएस-यूनिट एक अज्ञात नियंत्रक का परीक्षण

मैं अपने परीक्षण में एक नियंत्रक इंजेक्षन के लिए एक रास्ता को समझ नहीं सकता क्योंकि यह एक राज्य अन्य नियंत्रक में कॉन्फिगर भीतर इनलाइन और गुमनाम लिखा है:

$scope.deleteSomething = function() { 
    $modal.open(
    templateUrl: '/delete-item-modal.html', 
    controller: ['$scope', '$modalInstance', 'someService', 
     function($scope, $modalInstance, someService) { 
     .... 
     } 
    ], 
    resolve: { 
     ... 
    } 
    }); 
}; 

नियंत्रक controller: 'TheController' मैं की तरह कुछ नामित किया गया था, तो अपने परीक्षण में इस तरह करने से यह इंजेक्शन लगाने के कोई समस्या नहीं है जाएगा:

beforeEach(inject(function($controller) { 
    $controller('TheController', {/*dependancies to be injected*/}); 
})); 

लेकिन चूंकि नियंत्रक अनाम है, मैं इसे करने के लिए एक संभाल की जरूरत नहीं है और यह कैसे उपयोग करने के लिए समझ नहीं कर सकते हैं।

+0

तो, आप इस सवाल का जवाब है: एक नामित नियंत्रक में नियंत्रक refactor, यह परीक्षण योग्य बनाने के लिए। –

+0

@ जेबी निज़ेट हां, लेकिन मैं इससे बचने की कोशिश कर रहा हूं क्योंकि यह मेरा कोड नहीं है और इसके बजाय इसे दोबारा नहीं बदला जाएगा। यह एक अंतिम उपाय होगा। – Noam

+0

मुझे पता है कि यह आपकी समस्या का समाधान नहीं करता है, लेकिन यदि यह आपका कोड नहीं है, और आपको इसे संशोधित करने की अनुमति नहीं है, तो आपको इसे यूनिट-टेस्ट नहीं करना चाहिए। कोड लिखने वाले डेवलपर को इसका परीक्षण करना चाहिए। –

उत्तर

0

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

  • आपको इसे संशोधित करने से पहले कोड के लिए परीक्षण लिखना होगा।
  • एकीकरण परीक्षण में अधिक समय लगेगा, लेकिन कोड की संरचना के कारण एकमात्र चीज संभव है।
  • नामित नियंत्रक निकालने से रिफैक्टरिंग एक कॉपी-पेस्ट और कम जोखिम है।
  • एक नामित नियंत्रक आसानी से परीक्षण किया जा सकता है।

यही वह है जो मैं करने जा रहा हूं।

0

आप एक अनाम नियंत्रक का परीक्षण कर सकते हैं। $controller(...) फ़ंक्शन पर नियंत्रक पहचानकर्ता को पास करने के बजाय, आपको नियंत्रक कन्स्ट्रक्टर सरणी को ही पास करना होगा।

ऐसा करने के लिए आपको अपने यूनिट परीक्षण कोड में नियंत्रक कोड पहुंचाने की आवश्यकता होगी। यह प्रायः जावास्क्रिप्ट (उदा। वेबपैक) के लिए मॉड्यूलरलाइजेशन टूल का उपयोग करके किया जाता है। लेकिन यह आपके परीक्षण कॉन्फ़िगरेशन और <script></script> टैग ऑर्डरिंग के भीतर किया जा सकता है। मैं एक उपकरण का उपयोग करने की सलाह देते हैं।

बावजूद, आप तीन फाइलों के साथ अंत:

// delete-item-controller.js 

DeleteItemController = ['$scope', '$modalInstance', 'someService', 
    function($scope, $modalInstance, someService) { 
    .... 
    } 
]; 

// state-controller.js 

$scope.deleteSomething = function() { 
    $modal.open(
     templateUrl: '/delete-item-modal.html', 
     controller: DeleteItemController, 
     resolve: { 
      ... 
     } 
    }); 
}; 

// delete-item-controller.spec.js 

beforeEach(inject(function($controller) { 
    $controller(DeleteItemController, {/*dependancies to be injected*/}); 
})); 

वैकल्पिक उदाहरण के लिए, मॉड्यूल लोडर

Webpack यह एल होगा का उपयोग का उपयोग कर ओक थोड़ा अलग है ... लेकिन यह DeleteItemController पर रखी गई icky, अंतर्निहित वैश्विक वस्तु को समाप्त करता है।

// delete-item-controller.js 

module.exports = ['$scope', '$modalInstance', 'someService', 
    function($scope, $modalInstance, someService) { 
    .... 
    } 
]; 

// state-controller.js 

var DeleteItemController = require("./delete-item-controller"); 

$scope.deleteSomething = function() { 
    $modal.open(
     templateUrl: '/delete-item-modal.html', 
     controller: DeleteItemController, 
     resolve: { 
      ... 
     } 
    }); 
}; 

// delete-item-controller.spec.js 

var DeleteItemController = require("./delete-item-controller"); 

beforeEach(inject(function($controller) { 
    $controller(DeleteItemController, {/*dependancies to be injected*/}); 
})); 
संबंधित मुद्दे