2016-12-20 5 views
7

मैं कोणीय 1.5 में एक घटक के लिए एक इकाई परीक्षण लिखने की कोशिश कर रहा हूं। मैं उस घटक और उसके डोम नोड्स का परीक्षण करना चाहता हूं। इस घटक में एक बाल घटक है जो काफी जटिल है।बाल घटकों को अनदेखा करते समय कोणीय 1.5 इकाई परीक्षण घटक

मेरा लक्ष्य इकाई घटक को संकलित किए बिना बाहरी घटक का परीक्षण करना है।

चूंकि मैं डीओएम का परीक्षण करना चाहता हूं, इसलिए इस परीक्षण के लिए $ घटक नियंत्रक का उपयोग करने के लिए पर्याप्त नहीं है।

यहाँ मैं प्राप्त करना चाहते हैं की एक छोटी सी उदाहरण है:

घटक कोड:

it('my-component should render username', function() { 
    var template = '<my-component username="username"></my-component>', 
    element, 
    scope, 
    date; 

    scope = $rootScope.$new(); 
    scope.username = 'John'; 

    element = $compile(template)(scope); 
    scope.$digest(); 

    username = element.find('span'); 
    expect(username.text()).to.be.equal('John'); 
}); 

मेरी कॉम्प्लेक्स घटक: मेरे घटक के लिए

angular.module('app').component('myComponent', { 
    bindings: { 
    username: '<', 
    }, 
    template: ` 
    <span>{{ $ctrl.username }}</span> 
    <my-complex-component /> 
    ` 
    controller: function() {} 
}); 

यूनिट परीक्षण तत्काल नहीं होना चाहिए। इसे टेम्पलेट में प्रतिरोध करना चाहिए जैसा कि यह है। यूनिट टेस्ट में तत्व बनाना

<span>John</span> 
<my-complex-component /> 

क्या ऐसा करने का कोई तरीका है?

+0

जैसा कि मुझे पता है कि यह वास्तव में काम करता है कि आप कैसे उम्मीद करते हैं। जब आप अपने घटक को संकलित करते हैं तो यह आंतरिक घटकों को संकलित नहीं करता है। बस 'console.log (तत्व)' देखें। –

+0

दुर्भाग्यवश, मेरा घटक और मेरा-जटिल घटक दोनों मॉड्यूल ऐप में स्थित हैं। चूंकि मुझे मॉड्यूल को नकल करने के लिए angular.mock.module ('app') को कॉल करना है, इसलिए यह दोनों घटकों को लोड करता है और यह मेरे जटिल-घटक को संकलित करने का प्रयास करता है। –

+0

आप 'मेरा-जटिल-घटक' को आजमा सकते हैं और नकल कर सकते हैं। [यह जवाब] देखें (http://stackoverflow.com/questions/17533052/how-do-you-mock-directives-to-enable-unit-testing-of-higher-level-directive#answer-21923462) मॉकिंग पर एक निर्देश लेकिन [$ compileProvider.component] (https://docs.angularjs.org/api/ng/provider/$compileProvider#component) का उपयोग करें – user2718281

उत्तर

1

यह परीक्षण करने के लिए एक तरह से, लेकिन अंतिम परिणाम होगा नहीं है:

<span>John</span> 
<ng-transclude></ng-transclude> 

घटक कोड:

angular.module('app').component('myComponent', { 
    enter code herebindings: { 
    username: '<', 
    }, 
    template: ` 
    <span>{{ $ctrl.username }}</span> 
    <ng-transclude></ng-transclude> 
    `, 
    transclude: true, // Added property 
    controller: function() {} 
}); 

आप देख सकते हैं मैं नष्ट कर दिया <my-complex-component>, और बदले <ng-transclude> गयी।

इसका मतलब है कि आप बाहर से अपनी जानकारी जोड़ सकते हैं और इसे एनजी-ट्रांसफर के स्थान पर इंजेक्शन दिया जाएगा।

आपका मुख्य html में उदाहरण इस के लिए:

<my-component> 
    <my-complex-component></my-complex-component> 
</my-component> 

तरीका है कि आप शुरू से ही चाहते थे में डोम में होगा:

<span>John</span> 
<my-complex-component></my-complex-component> 

के बाद कि आपकी परीक्षण काम करना चाहिए।

मुझे आशा है कि यह उत्तर वही है जो आप चाहते थे और यह आपकी मदद करेगा।

+1

मुझे यकीन नहीं है कि घटक का मार्कअप बदलना सही दृष्टिकोण है। यह मार्कअप कम अंतर्ज्ञानी बनाता है। इसके अलावा, अगर एक से अधिक बाल घटक हैं तो क्या होगा? – isherwood

+0

मुझे लगता है कि यह बेहतर तरीका है यदि आप अपने घटकों को और अधिक टेस्टेबल होना चाहते हैं, और इस तरह से आप अपने परीक्षणों को तोड़ने के बिना अपने मुख्य भाग के अंदर कई घटक डाल सकते हैं। इस तरह आप देख सकते हैं कि जब चीजें तोड़ने लगती हैं तो आपका मुख्य घटक अभी भी काम करता है (या नहीं)। – Alon

2

Here is a very good explanation वर्तमान घटक के तहत पूरे पेड़ को प्रस्तुत किए बिना किसी घटक का परीक्षण कैसे करें।

तुम क्या चाहते

उथले प्रतिपादन कहा जाता है (बच्चे घटक के पूरे टेम्पलेट प्रतिपादन से बचने)

और कोणीय 1.5 इसे बाहर के- the- बॉक्स प्रदान नहीं करता है।

यदि आप उपरोक्त लिंक को देखते हैं, तो Wojciech Zawistowski दिखाता है कि उथले प्रतिपादन को प्राप्त करने के लिए नीचे सहायक का उपयोग कैसे करें।

export function componentSpyOn(name) { 
    function componentSpy($provide) { 
    componentSpy.bindings = []; 

    $provide.decorator(name + 'Directive', ($delegate) => { 
     let component = $delegate[0]; 

     component.template = ''; 
     component.controller = class { 
     constructor() { 
      componentSpy.bindings.push(this); 
     } 
     }; 

     return $delegate; 
    }); 
    } 

    return componentSpy; 
} 
0

आप एक खाली मॉड्यूल के साथ इकाई परीक्षण में बाल घटक मॉड्यूल परिभाषा को ओवरराइट कर सकते हैं।

// Unit Test Parent component 
describe('Unit Testing: myComponent Component',() => { 

    beforeEach(() => { 
    // overwrite module 
    angular.module('myComplexComponent', []); 
    module('myComponent'); 
    }); 
}); 

अब माता-पिता घटक अभी भी इंजेक्षन और बच्चे घटक प्रस्तुत करना करने की कोशिश करेंगे, लेकिन जैसा कि इस बच्चे घटक पूरी तरह से खाली है कुछ नहीं होगा।

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