2016-02-05 14 views
18

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

config/express.js

var app = express(); 
    // middleware, etc 
    var router = require('../app/router')(app); 

एप्लिकेशन/रूटर/index.js

module.exports = function(app) { 
    app.use('/api/books', require('./routes/books')); 
    }; 

एप्लिकेशन/रूटर/मार्गों/books.js

var controller = require('../../api/controllers/books'); 
    var express = require('express'); 
    var router = express.Router(); 

    router.get('/', controller.index); 

    module.exports = router; 

एप्लिकेशन/API/नियंत्रक/books.js

// this is just an example controller 
exports.index = function(req, res) { 
    return res.status(200).json('ok'); 
}; 

एप्लिकेशन/परीक्षण/API/मार्गों/books.test.js

var chai = require('chai'); 
    var should = chai.should(); 
    var sinon = require('sinon'); 

    describe('BookRoute', function() { 

    }); 
+1

[कैसे एक्सप्रेस के साथ एक इकाई परीक्षण मार्गों करता है?] (Http://stackoverflow.com/questions/9517880/how-does-one-unit-test-routes-with-express) – gnerkus

+0

डुप्लिकेट नहीं है की संभावित डुप्लिकेट , जुड़ा हुआ प्रश्न पुरानी एक्सप्रेस के लिए है जिसमें एक अलग एपीआई थी। – Kos

+0

इसका उपयोग करें [लिंक] (http://www.designsuperbuild.com/blog/unit_testing_controllers_in_express/) या यह [लिंक] (http://www.chrisstead.com/archives/1128/unit-testing-express-routing/)। –

उत्तर

1

मैंने पाया this blog अविश्वसनीय रूप से व्यावहारिक जब मेरे अपने परीक्षण सर्वर अंतराल।

ब्लॉग वह संबोधित करते में:

  • कैसे endpoint परीक्षण पुस्तकालय supertest उपयोग करने के लिए।

  • प्रत्येक एंडपॉइंट परीक्षण से पहले और बाद में अपने आवश्यक मार्गों के साथ प्रोग्रामेटिक रूप से स्पिन अप और एक एक्सप्रेस सर्वर को कैसे फाड़ें। (वह यह भी बताता है कि आप ऐसा क्यों करना चाहते हैं)।

  • एक सामान्य गॉचा से कैसे बचें, आपके यूनिट परीक्षणों में आवश्यक मॉड्यूल को कैशिंग करने की आवश्यकता होती है, जिससे अनपेक्षित परिणाम होते हैं।

उम्मीद है कि इससे मदद मिलती है। शुभकामनाएं और यदि आपके कोई और प्रश्न हैं तो मुझे बताएं।

+3

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

7

कोड:

config/express.js

var app = express(); 
// middleware, etc 
var router = require('../app/router')(app); 

module.exports = app; 

एप्लिकेशन/परीक्षण/API/मार्गों/books.test.js

var chai = require('chai'); 
var should = chai.should(); 
var sinon = require('sinon'); 
var request = require('supertest'); 
var app = require('config/express'); 

describe('BookRoute', function() { 
    request(app) 
     .get('/api/books') 
     .expect('Content-Type', /json/) 
     .expect('Content-Length', '4') 
     .expect(200, "ok") 
     .end(function(err, res){ 
      if (err) throw err; 
     }); 
}); 

बातें:

यदि यो आपके सर्वर को परीक्षणों के एक सेट की शुरुआत में प्रारंभिक स्थिति की आवश्यकता होती है (क्योंकि आप कॉल को निष्पादित कर रहे हैं जो सर्वर स्थिति को म्यूटेट करते हैं), आपको एक ऐसा फ़ंक्शन लिखना होगा जो एक ताज़ा कॉन्फ़िगर किया गया ऐप और परीक्षण के प्रत्येक समूह की शुरुआत करेगा । एक एनपीएम लाइब्रेरी है: https://github.com/bahmutov/really-need जो आपको अपने सर्वर के ताज़ा तत्काल संस्करण की आवश्यकता होगी।

1

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

router.get('/', controller.index); 

मैं अगर वहाँ एक्सप्रेस पुस्तकालय से रूट की एक सूची प्राप्त करने के लिए एक स्पष्ट तरीका था देखने के लिए चारों ओर देखा, लेकिन मैं नहीं था ' एक देखें नहीं। आप शायद लाइब्रेरी को ही देख सकते हैं और यह देखने के लिए अपने आंतरिक जांच सकते हैं कि क्या आप सही ढंग से मार्ग निर्धारित करते हैं या नहीं। एक और विकल्प हालांकि इसे मजाक करना है और बस जांचें कि आप इसे सही तरीके से कॉल कर रहे हैं।

यह बहुत जटिल हो जाएगा क्योंकि आपको कोड की एक पंक्ति का परीक्षण करने के लिए जावास्क्रिप्ट के कुछ मौलिक हिस्सों को नकल करने की आवश्यकता है। यहाँ कैसे मैंने किया है:

describe('BookRoute', function() { 
    it("should route/to books controller index", function() { 
    var controller = require('../../../api/controllers/books'); 
    var orig_this = this; 
    var orig_load = require('module')._load; 
    var router = jasmine.createSpyObj('Router', ['get']); 
    var express = jasmine.createSpyObj('express', ['Router']); 
    express.Router.and.returnValues(router); 
    spyOn(require('module'), '_load').and.callFake(function() { 
     if (arguments[0] == 'express') { 
     return express; 
     } else { 
     return orig_load.apply(orig_this, arguments); 
     } 
    }); 
    require("../../../router/routes/books"); 
    expect(router.get).toHaveBeenCalledWith('/', controller.index); 
    }); 
}); 

यहाँ क्या हो रहा है मैं चमेली के spyOn फ़ंक्शन का उपयोग किया module.js में _load समारोह जो कॉल की आवश्यकता के सभी क्या संभालती है spyOn है। ऐसा इसलिए है कि जब हमें पुस्तकों के राउटर की आवश्यकता होती है और इसे कॉल ('एक्सप्रेस') की आवश्यकता होती है तो हम अपने एक्सप्रेस SpyObj को वापस कर सकते हैं जिसे हमने jasmine.createSpyObj के साथ बनाया है। एक बार जब हमने अपने जासूसी ऑब्जेक्ट के साथ एक्सप्रेस बदल दिया है, तो हम इसे हमारे राउटर स्पाइबेज वापस कर सकते हैं जो हमें राउटर.get पर जासूसी करने देगा। फिर हम यह सुनिश्चित करने के लिए जांच सकते हैं कि इसे '/' और नियंत्रक.इंडेक्स कहा जाता है।

यदि आप इसका बहुत उपयोग करना चाहते हैं तो इसे शायद किसी प्रकार की उपयोगिता में बनाया जा सकता है।

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

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