2015-11-18 8 views
9

काम नहीं कर रहा है मैं एक कोणीय कारखाने के लिए कुछ परीक्षण लिख रहा हूं और कुछ उम्मीदें काम नहीं कर रही हैं और मुझे वास्तव में पता नहीं क्यों है।जावास्क्रिप्ट गेटर के लिए जैस्मीन परीक्षण

यह मेरा कारखाना है (इसका हिस्सा)। 'सख्त उपयोग करें';

angular.module('myAppMod') 
    .factory('Person', function(BaseModel) { 
    return BaseModel.extend({ 
     get fullname() { 
     var name = []; 
     if (this.first_name) { 
      name.push(this.first_name); 
     } 
     if (this.person_extra && this.person_extra.middle_name) { 
      name.push(this.person_extra.middle_name); 
     } 
     if (this.last_name) { 
      name.push(this.last_name); 
     } 
     return name.join(' '); 
     } 
    }); 
    }); 

और चमेली का परीक्षण करती है:

var p; 
beforeEach(function() { 
    p = new Person({ 
    first_name: 'first_name', 
    person_extra: { 
     middle_name: 'middle_name', 
     media_item_id: null 
    }, 
    last_name: 'last_name', 
    security_level: 'security_level' 
    }, true); 
}); 

it("has a fullname", function() { 
    expect(p.fullname).toEqual('first_name middle_name last_name'); 
}); 

p.fullname"" (रिक्त स्ट्रिंग) लौट रहा है और कारखाने में, console.log(this.first_name), undefined है।

किसी भी मदद की वास्तव में सराहना की जाती है। अग्रिम में धन्यवाद

+1

क्या आप कारखाने का पूरा कोड दिखा सकते हैं? धन्यवाद। – alecxe

+1

जावास्क्रिप्ट की कौन सी बोली आप इसे लिख रहे हैं? और आप किस ब्राउज़र में परीक्षण चला रहे हैं? क्या आप निश्चित रूप से जानते हैं कि प्राप्त करने वाले ब्राउज़र द्वारा सिंटैक्स प्राप्त किया जाता है? उदाहरण के लिए, शायद फैंटॉमजेएस गेटर्स का समर्थन नहीं करता ... बस जोर से सोच रहा है। –

+0

@ सुनीलडी। सादा जावास्क्रिप्ट है। मैं मैक पर नवीनतम क्रोम का उपयोग कर रहा हूँ। – Ricbermo

उत्तर

6

संपादित करें: आगे की जांच के बाद, मैंने अपना जवाब बदल दिया है।

यह काम नहीं कर रहा है क्योंकि आप extend विधि के माध्यम से गेटर आशुलिपि (get fnName() { }) का उपयोग कर रहे हैं। गेटर काthis अज्ञात ऑब्जेक्ट स्वयं है और बैकबोन मॉडल के तरीकों और गुणों का वारिस नहीं करता है, जबकि this फ़ंक्शन गुणों में करता है। मैंने codepen that illustrate your problem बनाया है।

यही है, अगर यह आपके मॉडल

var Model = BaseModel.extend({ 
    get isBackboneModelThroughGetter() { 
    return !!this.get; 
    }, 
    isBackboneModel: function() { 
    return !!this.get; 
    }, 
}); 

है तो मॉडल का एक उदाहरण इस परीक्षण पास कर देगा:

it('should make you wonder', function() { 
    var model = new Model(); 
    expect(model.isBackboneModel()).toBe(true); 
    expect(model.isBackboneModelThroughGetter).not.toBe(true); 
}); 

इस प्रकार, आपके व्यक्ति कारखाने काम करने के लिए, आप की आवश्यकता होगी: this.get('propertyName')के बजाय:

  1. उचित रीढ़ कॉल द्वारा हर संपत्ति का उपयोग बदलने के लिए
  2. समारोह गुण द्वारा सभी ही टिककर खेल बदलें: full_name : function() { /*...*/ } के बजाय get full_name() { /* ... */ }
  3. model.full_name() द्वारा model.full_name के लिए कॉल बदलें;
1

मुझे लगता है कि आप अंतर्निहित angular.extend का उपयोग कर रहे हैं। angular.extend कॉपी गेटर्स और सेटर्स नहीं है। वहाँ अगस्त 2014

कारण है कि यह अभी भी लागू नहीं है के रूप में की 12 वीं के बाद से इस विशिष्ट विषय पर GitHub पर an open issue हो गया है:

कोणीय सहायक कार्यों है कि यह आंतरिक रूप से उपयोग करता है में से कुछ को उजागर करता है। यह extend, copy और कई अन्य लोगों के लिए मामला है। ऐसे अन्य पुस्तकालय हैं जो इन कार्यों में विशेषज्ञ हैं, उनके फोकस रखें और बेहतर काम कर सकते हैं।

यह सहायक उपयोगकर्ताओं को इन सहायक कार्यों को बड़े और धीमे बनाने के लिए सबसे अच्छे हित में नहीं है, क्योंकि इन्हें आंतरिक रूप से उपयोग किया जाता है और उस दिशा में किसी भी बदलाव से डाउनलोड आकार और प्रदर्शन में प्रत्यक्ष प्रभाव पड़ सकता है। साथ ही, जिन ऐप्स को सबसे सटीक संस्करण की आवश्यकता है, उन्हें अन्य पुस्तकालयों के साथ बेहतर सेवा दी जानी चाहिए।

इस समस्या को हल करने के कई तरीके हैं। decaf.js एक उदाहरण कार्यान्वयन प्रदान करता है जो ज्यादातर मामलों के लिए काम करना चाहिए। गिटहब शायद उनके कोड में गोता लगाने के लिए एक बेहतर वातावरण है, लेकिन यह नीचे आता है:

function extend (me) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    decaf.each(args, function (o) { 
     for (var key in o) { 
      if (o.hasOwnProperty(key)) { 
       var desc = Object.getOwnPropertyDescriptor(o, key); 
       var g = desc.get; 
       var s = desc.set; 

       if (g || s) { 
        Object.defineProperty(me, key, { get: g, set: s, enumerable: true }); 
       } else { 
        me[key] = o[key]; 
       } 
      } 
     } 
    }); 

    return me; 
} 
संबंधित मुद्दे