2016-01-12 7 views
9

मैंने कोणीय जेएस का उपयोग करके एक वेब अनुप्रयोग विकसित किया है। मुझे कुछ अतिरिक्त सीआर मिल रही हैं जिन्हें टीटीडी दृष्टिकोण का उपयोग करने में लागू करने की आवश्यकता है। जैस्मीन और कर्म का उपयोग कर हमारे पास यूनिट टेस्ट केस हैं। वर्तमान में हम जिस चुनौती का सामना करते हैं वह तब होती है जब हम एकाधिक नियंत्रकों के लिए यूनिट टेस्ट केस लिखने का प्रयास करते हैं। मेरे पास होम कंट्रोलर & पर एक मुख्य पृष्ठ रिटर्न है, इसका एक अन्य नियंत्रक में प्रसारण कार्यक्रम है। जब मैं नियंत्रक के लिए यूनिट टेस्ट केस ऑब्जेक्ट लिखता हूं जिसमें इस प्रसारण ईवेंट को प्रारंभ नहीं किया गया है।एकाधिक नियंत्रकों के साथ कोणीय जेएस टेस्ट संचालित विकास

क्या एक आश्रित वस्तु के रूप में दूसरे नियंत्रक को इंजेक्ट करने का कोई तरीका है। संदर्भ नमूना लिंक या डेमो कोड के साथ उत्तर बहुत सराहना की है।

+0

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

उत्तर

9

आप बताते हैं कि आप जैस्मीन और कर्म का उपयोग कर रहे हैं, इसलिए मुझे लगता है कि आप इकाई परीक्षण कर रहे हैं। यदि आप "यूनिट" परीक्षण कर रहे हैं तो आपको मजाक कर, जासूसी, सभी इंजेक्शन सेवाओं के दौरान व्यक्तिगत रूप से प्रत्येक नियंत्रक का परीक्षण करना चाहिए।

beforeEach(inject(function ($rootScope, $controller) { 
     rootScope = $rootScope; 
     scope = $rootScope.$new(); 
     controller = $controller('MyCtrl as ctrl', { 
      '$scope': scope 
     });    
    })); 

    it('', function(){ 

    //Arrange 
    controller.counter = 0; // Your controller is listening on scope.$on to update this counter. 

    //Act 
    rootScope.$broadcast('xyz', {}); 

    //Assert 
    expect(controller.counter == 1).toBe(true); 
    rootScope.$broadcast('xyz', {}); 
    expect(controller.counter == 2).toBe(true); 
    rootScope.$broadcast('xyz', {}); 
    expect(controller.counter == 3).toBe(true); 
    }); 

बस प्रसारण के साथ सावधान रहें। केवल एक डोमेन इवेंट (मॉडल अपडेट/हटाया/बनाया गया), या कुछ वैश्विक (साइनइन, साइनआउट) $ प्रसारण से अधिक यात्रा करना चाहिए। अन्यथा, इसे एक सेवा + निर्देश के साथ प्रतिस्थापित किया जाना चाहिए। एक उदाहरण कोणीय सामग्री https://material.angularjs.org/latest/api/service/ $ mdDialog है जो एक बैकिंग सेवा के साथ 1 निर्देश है जिसे कहीं से भी खुला/बंद किया जा सकता है।

2

आप $ नियंत्रक सेवा के साथ किसी भी नियंत्रक को इंजेक्ट कर सकते हैं, उदा। https://docs.angularjs.org/api/ngMock/service/ $ नियंत्रक

तो तुम क्या है कि नियंत्रक इंजेक्षन पहले है, तो अपने अन्य नियंत्रक:

beforeEach(inject(function ($rootScope, $controller) { 
      scope = $rootScope.$new(); 
      controller = $controller('MyCtrl', { 
       '$scope': scope 
      }); 
     })); 

यहाँ दस्तावेज़ देख सकेंगे। तो उस समय पहली नियंत्रक को तुरंत चालू कर दिया जाएगा जब दूसरा तत्काल हो जाता है।

1

मैं कोणीय के लिए नया हूं, ऐसा लगता है कि एक साथ कई नियंत्रकों को इंजेक्ट करना संभव है। हालांकि सबसे अच्छा अभ्यास एक नकली नियंत्रक उत्पन्न करना है जो व्यवहार करता है क्योंकि आप दूसरे नियंत्रक से व्यवहार करने की अपेक्षा करते हैं। यह उन चीजों की संख्या को कम करता है जिन्हें आप एक बार में परीक्षण कर रहे हैं। नकली नियंत्रक, http://www.powdertothepeople.tv/2014/08/28/Mocking-Controller-Instantiation-In-AngularJS-Unit-Test/ बनाने के लिए निम्न लिंक सहायक हो सकता है।

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