2016-12-14 10 views
12

के साथ यूनिट परीक्षण मैं यूनिट परीक्षण लिखने के लिए नया हूं और किसी फ़ंक्शन के कुछ परीक्षण परीक्षण भाग की आवश्यकता है।moment.js

मेरे समारोह इस तरह दिखता है ...

getData() { 
return this.parameters.map(p => { 
     return { 
      name: p.name, 
      items: p.items.map(item => { 

       const toTime = item.hasOwnProperty('end') ? moment.utc(item.end._d).unix() : null; 
       const fromTime = item.hasOwnProperty('start') ? moment.utc(item.start._d).unix() : null; 

       return { 
        id: item.id, 
        fromTime: fromTime, 
        toTime: toTime, 
       }; 
      }), 
     }; 
    }); 
} 

और अब तक अपने परीक्षण इस (चमेली) की तरह लग रहा

describe('getData()', function() { 
it('should return json data', function() { 
    $ctrl.parameters = [{ 
     name: 'test', 
     items: [{ 
      id: 1, 
      fromTime: null, 
      toTime: null 
     }, { 
      id: 13, 
      fromTime: null, 
      toTime: null 

     }] 
    }]; 

    expect($ctrl.getData()).toEqual([{ 
     name: 'test', 
     items: [{ 
      id: 1, 
      fromTime: null, 
      toTime: null 
     }, { 
      id: 13, 
      fromTime: null, 
      toTime: null 
     }] 
    }]); 
}); 
}); 

यह परीक्षण काम कर रहा है/गुजर, लेकिन आप मुझे देख सकते हैं अगर/else जो Moment.js का उपयोग करता है तो टर्नरी का परीक्षण नहीं कर रहा हूं। मूल रूप से टर्नरी क्या करता है यह जांचता है कि आइटम में start/end नामक एक संपत्ति है और यदि ऐसा होता है, तो उस मान को एक युग/यूनिक्स टाइमस्टैंप में परिवर्तित करें और इसे toTime या fromTime पर असाइन करें। इसलिए यदि वस्तुओं की संपत्ति 'Sat Oct 31 2015 00:00:00 GMT+0000 (GMT)' के मान के साथ समाप्त होती है, तो इसे '1446249600' में परिवर्तित कर दिया जाएगा और toTime

उम्मीद है कि यह समझाएगा! मुझे यकीन नहीं है कि इसके लिए एक परीक्षा कैसे लिखनी है और किसी भी मदद/सुझावों की सराहना करेंगे।

उत्तर

6

सबसे आसान विकल्प इनपुट के लिए मैन्युअल रूप से दो उदाहरण तिथियां बनाना है। उदाहरण के लिए:

$ctrl.parameters = [{ 
    name: 'test', 
    items: [{ 
     id: 1, 
     start: moment.utc('2017-01-01T01:00:00'), 
     end: moment.utc('2017-01-01T06:00:00') 
    }, { 
     id: 13, 
     start: moment.utc('2017-01-02T08:00:00'), 
     end: null 

    }] 
}]; 

(ऊपर के उदाहरण में ध्यान दें, मैं start और end क्रमशः fromTime और toTime बदल गया है, के बाद से वह यह है कि क्या getData इनपुट के लिए उम्मीद कर रही है।)

तब उनके यूनिक्स यह पता लगाने टाइम स्टाम्प्स। आप इस हिस्से में बाहर से कर सकते हैं - उदाहरण के लिए, मैं सिर्फ ऊपर ब्राउज़र डेवलपर उपकरण (F12) moment.js वेबसाइट पर खोला, कंसोल में निम्नलिखित बयानों का मूल्यांकन, और टाइमस्टैम्प मूल्यों को पकड़ा:

moment.utc('2017-01-01T01:00:00').unix() 
moment.utc('2017-01-01T06:00:00').unix() 
moment.utc('2017-01-02T08:00:00').unix() 

अंत में , इकाई परीक्षण में वापस आ गया है, बस सत्यापित करें कि timestamps उम्मीद मान से मेल:

expect($ctrl.getData()).toEqual([{ 
    name: 'test', 
    items: [{ 
    id: 1, 
    fromTime: 1483232400, 
    toTime: 1483250400 
    }, { 
    id: 13, 
    fromTime: 1483344000, 
    toTime: null 
    }] 
}]); 

वैकल्पिक रूप से, अगर आप अपने इकाई परीक्षण में हार्डकोडेड टाइम स्टांप नहीं होगा, आप के बजाय अपने स्वयं के चर में प्रत्येक उदाहरण तारीख स्टोर कर सकते हैं (उदाहरण के लिए, start1, end1), और फिर तुलना करें, उदाहरण के लिए, start1.unix():

// Arrange 
const start1 = moment.utc('2017-01-01T01:00:00'); 
const end1 = moment.utc('2017-01-01T06:00:00'); 
const start2 = moment.utc('2017-01-02T08:00:00'); 
$ctrl.parameters = [{ 
    name: 'test', 
    items: [{ 
     id: 1, 
     start: start1, 
     end: end1 
    }, { 
     id: 13, 
     start: start2, 
     end: null 

    }] 
}]; 

// Act 
const result = $ctrl.getData(); 

// Assert 
expect(result).toEqual([{ 
    name: 'test', 
    items: [{ 
    id: 1, 
    fromTime: start1.unix(), 
    toTime: end1.unix() 
    }, { 
    id: 13, 
    fromTime: start2.unix(), 
    toTime: null 
    }] 
}]); 

कि पूरी तरह से ठीक है, के बाद से इकाई परीक्षण अपने कोड, नहीं moment.js का परीक्षण करने के लिए है। यह आप पर निर्भर करता है।

ध्यान दें कि मैं परीक्षण आयोजित करने के लिए Arrange-Act-Assert पैटर्न का उपयोग कर रहा हूं। फिर, आप तक, लेकिन एक बार आपके यूनिट परीक्षण जटिल होने लगते हैं, जो चीजों को पालन करने में आसान रहता है।

किसी भी तरह से, आप कैसे आप अपने getData विधि में toTime और fromTime गणना बदलने के लिए, कोड लिखा के रूप में यदि आप या तो start या end के लिए null में पास काम नहीं करेगा क्योंकि आवश्यकता होगी। विशेष रूप से, start के लिए मान में के लिए मान्य होने पर सत्य वापस आ जाएगा, लेकिन यह त्रुटि होगी क्योंकि यह item.start._d का मूल्यांकन करने का प्रयास करता है। इसके बजाय, मैं निम्नलिखित करने के लिए उन 2 लाइनों बदलने की सलाह देते:

const toTime = item.end ? moment.utc(item.end._d).unix() : null; 
const fromTime = item.start ? moment.utc(item.start._d).unix() : null; 

मैं भी पल वस्तु की _d संपत्ति का उपयोग कर के खिलाफ सलाह देंगे, क्योंकि ऐसा करना एक आंतरिक (निजी) चर रहा है। चूंकि start और end पहले से ही पल वस्तुओं रहे हैं, आप के बजाय सिर्फ यह करने के लिए सक्षम हो सकता है:

const toTime = item.end ? item.end.unix() : null; 
const fromTime = item.start ? item.start.unix() : null; 

एक पूरा jsbin उदाहरण ऊपर के सभी युक्त बदलावों का सुझाव यहाँ उपलब्ध है:

https://jsbin.com/xuruwuzive/edit?js,output

ध्यान दें कि कुछ सुधार किया जा सकता था तो यह AngularJS के संदर्भ से बाहर चलाता है (GetData एक स्टैंडअलोन समारोह है कि बल्कि $ctrl के माध्यम से की तुलना में, सीधे अपने मानकों को स्वीकार करता है)।

+0

धन्यवाद! यह काम कर रहा है। और नमूना के लिए भी धन्यवाद! –

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