javascript इकाई परीक्षण नोड जे एस नियंत्रक के लिए सबसे अच्छा तरीका क्या है जो एक सेवा पद्धति का उपयोग कर रहा है




node.js unit-testing (2)

मेरा नियंत्रक => नीचे नियंत्रक reqpoertService.getFiles विधि का उपयोग कर रहा है और वह विधि स्वयं डेटा को कॉल करने के लिए बाह्य API का उपयोग कर रहा है।

function getFiles(req, res) {
    reportService.getFiles({
        fromDate: req.query.fromdate,
        endDate: req.query.enddate,
        fileTypes: req.query.filetypes || [],
        fileStatus: req.query.filestatus || []
    })
    .then(data => {
       logger.info('-> reportService.getFiles :: Successfully fetched data',
                   resolveLogger({ statusCode: res.statusCode })
       );
       res.send(data);
   })
   .catch(err => {
       logger.error('<- OOPS :: reportService.getFiles fail to fetch data');
       res.status(statusCodes.INTERNAL_SERVER_ERROR).send({});
       logger.error('<- ERROR', resolveLogger({
           statusCode: res.statusCode,
           errMessage: err.message,
           errorStack: err
       }));
   });
}

रिपोर्टर सेवा

function getFiles() {
    return new Promise((resolve, reject) => {
        requestPromise(options)
            .then(data => {
                var duration = new Date - start;
                logger.info(resolveLogger({
                    duration: duration + 'ms',
                    reqUrl: options.url,
                    bodyLengh: data && data.length
                }));
                logger.info('<= Request complete successfully.');
                var resData = JSON.parse(data);
                resolve(resData);
            })
            .catch(error => {
                logger.error('=> Request failed for URL:', options.url);
                reject(error);
            });
    });
}

नियंत्रक से ऊपर परीक्षण करने के लिए मेरा यूनिट टेस्ट दृष्टिकोण

it('METHOD: getFiles -> should response 500 without data', done => {
    nock('http://localhost:1708/fakeapi')
        .get('/files')
        .reply(statusCodes.INTERNAL_SERVER_ERROR);

    const res = buildResponse();
    const req = httpMocks.createRequest({
        method: 'GET',
        url: '/api/submitted-data/1/files'
    });

    res.on('end', function () {
        var data = res._getData();
        expect(data).toEqual({});
        expect(statusCodes.INTERNAL_SERVER_ERROR).toBe(res.statusCode);
        done();
        nock.cleanAll();
    });

    reporterController.getFiles(req, res);
});

कोई मुझे सुझाव दे सकता है कि मैं जिस दृष्टिकोण का अनुसरण कर रहा हूं वह स्वीकार्य है या यूनिट टेस्ट करने के लिए कोई बेहतर तरीका है। जैसा कि मैं इकाई परीक्षण करने के लिए शुरुआत कर रहा हूँ।


आपके पास यूनिट परीक्षण की एक आलोचना है, और यह है कि आप वास्तव में अपने परीक्षण को सेटअप करने से पहले प्रत्येक / प्रत्येक का उपयोग नहीं कर रहे हैं

इसका अर्थ मेरा है:

  • आप वर्णन ब्लॉक का उपयोग कर सकते हैं जिसमें "यह" वेरिएबल घोषित करने के लिए नेस्टेड है, जो परीक्षण सेटअप (पूर्व / सभी पूर्व) के दौरान सेट किए जाएंगे और वे "यह" के दौरान वास्तव में "अपेक्षा" होने चाहिए।
  • "यह" खुद को क्लीनर और छोटा होना चाहिए, लगभग केवल उम्मीद की रचना की जा रही है

उस पर विचार करना अच्छा लगता है


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

थॉटवर्क्स से यह लेख परीक्षण के लिए इस दृष्टिकोण को समझाने में काफी मददगार है: https://www.thoughtworks.com/insights/blog/mockists-are-dead-long-live-classicists

मैं भी इस वीडियो शीर्षक इयान कूपर को देखने का सुझाव देता हूं: टीडीडी जहां यह सब गलत हो गया था: https://vimeo.com/68375232

मैं अपने सुझाव की सराहना करता हूं कि थोड़ा उच्च स्तर है, इसलिए मुझे लगता है कि आपका परीक्षण ऐसा दिखना चाहिए:

  1. अपने परीक्षण के संदर्भ को स्थापित करना, डेटा आदि की स्थापना करना। अपने मामले में एक फाइल को सुनिश्चित करना सुनिश्चित करें (यह एक बाहरी एपीआई से आ रहा है अगर प्रतिक्रिया का ठिकाना हो सकता है)
  2. अपने बाह्य एपीआईएस के लिए मजाक उड़ाएं (बाह्य एपीआई बार बाहर, कवर नीचे, 401, 500 आदि) को कवर करने के लिए।
  3. अपने एपीआई को बुलाओ
  4. आपके एपीआई एंडपॉइंट रिटर्न के परिणाम पर जोर दें

इसके बाद आप अलग-अलग परीक्षणों की जांच कर सकते हैं कि बाहरी एपीआईएस वापसी







jasmine