mocha

2012-06-10 18 views
15

के साथ express.js एप्लिकेशन का सेटअप/टियरडाउन मैं मोचा का उपयोग करके एक स्टैंडअलोन टेस्ट सूट बनाने की कोशिश कर रहा हूं, कि एक परिपूर्ण दुनिया में मेरा express.js एप्लिकेशन शुरू होगा, एक पृष्ठ प्रस्तुत करने के लिए ज़ोंबी का उपयोग करें, एक गुच्छा की जांच करें सामान और फिर teardown/express.js आवेदन को मार डालो।mocha

क्या ऐसा करने का कोई आसान/सबसे अच्छा तरीका है?

एनबी। मेरे पास परीक्षण चलाने से पहले एक्सप्रेस एप्लिकेशन सर्वर चल रहा था, लेकिन यदि आप उन्हें दाढ़ी नहीं दे रहे हैं तो यक्स क्या अच्छे हैं।

+2

अच्छा सवाल है।मैंने खुद को थोड़ी देर के लिए देखा लेकिन एक सप्ताह के बाद मैंने अभी छोड़ दिया। मैं ज़ोंबी वास्तव में काम करने के लिए परेशान पाया। मैंने फैंटॉमजेएस के बारे में बहुत कुछ पढ़ा लेकिन मैंने इसे खुद कोशिश नहीं की। – Pickels

उत्तर

23

सबसे पहले, आपको अपनी वास्तविक ऐप को मॉड्यूल में स्थापित करने की आवश्यकता है, और उस फ़ाइल में आयात करें जो वास्तव में आपके ऐप को शुरू करता है। अब यह अलग है, वास्तव में सुनने से पहले आप ऐप को अपनी पूरी स्थिति में रख सकते हैं।

आपको अपने ऐप की वास्तविक सेटिंग को एक अलग फ़ाइल में ले जाना चाहिए, चलिए इसे ऐप.जेएस कहते हैं, जिसे आप नोड से चलाते हुए फ़ाइल से सुन सकते हैं, चलिए इसे index.js कहते हैं।

var app = require('./app'); 

app.listen(3000, function(){ 
    console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); 
}); 

इस से अपने ऐप्लिकेशन का लदान अलग वास्तव में यह सुनने वाले, करने के लिए आप की अनुमति देता है:

var express = require('express') 
    , routes = require('./routes'); 

var app = module.exports = express.createServer(); 

// Configuration 

app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

app.configure('production', function(){ 
    app.use(express.errorHandler()); 
}); 

// Routes 

app.get('/', routes.index); 

और index.js दिखाई देगा:

तो, app.js कैसा लगेगा उस ऐप को अपने यूनिट परीक्षणों में लोड करें।

अपने यूनिट परीक्षणों में, आप सर्वर को लाने और नीचे लाने के लिए सेटअप विधि और टियरडाउन विधि में कुछ करेंगे।

फ़ाइल परीक्षा/app_tests.js में:

describe('app', function(){ 
    var app = require('../app'); 
    beforeEach(function(){ 
    app.listen(3000); 
    }); 
    // tests here 
    afterEach(function(){ 
    app.close(); 
    }) 
}); 
+0

बहुत बढ़िया! लेकिन, मेरे मामले में, मेरे पास कई परीक्षण फाइलें हैं और ऐसा लगता है कि मोचा सभी फ़ाइलों को एक साथ निष्पादित करता है, जो परीक्षण फ़ाइलों के बीच कुछ खराब संघर्ष का कारण बनता है! मैं क्या कर सकता हूँ ? –

+0

प्रत्येक परीक्षण को एक अलग बंदरगाह पर सुनें - बस यादृच्छिक संख्या (पर्याप्त उच्च) –

+0

उत्कृष्ट समाधान चुनें! ऐसा करने का यह सही तरीका है। एक संशोधन: आपको वास्तव में ऐप.लिस्टन का नतीजा बंद करना चाहिए, ऐप नहीं, यानी: (पहले से पहले) "उदाहरण = app.listen (3000);" ... और फिर (बाद में) "instance.close()" –

4

Oved डी जवाब के अलावा।

एक्सप्रेस-app.js या कोई अन्य फ़ाइल में अपने अनुप्रयोग का विवरण दें:

module.exports = function (o) { 
    o = o || {}; 
    var app = express(); 

    // app.configure 
    // configure routes 
    if (o.someOption) { 
    // some additional test code 
    } 

    return app; 
} 

परीक्षण/01-some.js में परीक्षण का वर्णन:

var expressApp = require('../express-app'); 
describe('some', function() { 

    // just describe needed vars 
    var app, server, port; 

    // describe setup 
    before(function (next) { 
    // create app when 
    app = expressApp({routes: /api\/some\/.*/ /* put here some test options ...*/}); 
    // creating listener with random port 
    server = app.listen(function() { 
     // store port when it ready 
     port = server.address().port; 
     // and go to tests 
     next(); 
    }); 
    }); 

    // tests 
    it('should return valid result', function (done) { 
    // do a simple request to /api/some 
    http.request({ 
     host: 'localhost', 
     port: port, 
     path: '/api/some' 
    }, function (res) { 
     if (res.err) throw new Error(res.err); 
     done(); 
    }); 
    }); 

    // teardown 
    after(function() { 
    // stop listening that port 
    server.close(); 
    }); 

}); 

हो गया। ;-)

अब आप इस तरह के परीक्षणों की कोई गिनती बना सकते हैं। Express-app.js मॉड्यूल पर पैरा पास करके इसे परिभाषित करने के साथ परीक्षणों में केवल आवश्यक यूआरएल और सेवाओं को सक्षम करने के लिए आपको अनुशंसा करते हैं।


अद्यतन:

सुनिश्चित नहीं हैं कि यह कैसे mocha लेकिन बेहतर में काम करता है init.js को before और after कॉल ले जाने और mocha --require init.js साथ लोड करने के लिए।

फ़ाइल चाहिए कि तरह लग रहा है:

// use it in your mocha tests 
global.setupEnv = function setupEnv (o, before, after) { 

    // just describe needed vars 
    var env = Object.create(null); 

    // setup 
    before(function (next) { 
     // create app 
     env.app = expressApp(o); 
     // creating listener with random port 
     env.server = env.app.listen(function() { 
      // store port when it ready 
      port = env.server.address().port; 
      env.app.log('Listening on ', env.port); 
      // and go to tests 
      next(); 
     }); 
    }); 

    // teardown 
    after(function() { 
     // stop listening that port 
     env.server.close(); 
    }); 

    return env; 
} 

और अपने परीक्षण में:

// requiring dependencies 
var request = require('request'); 

describe('api', function() { 

    // describe setup 
    var env = global.setupEnv({ 
      routes: 'api/some' 
     }, before, after); 

    // tests 
    it('should pass', function (done) { 
     request('http://localhost:' + env.port, function (error, response, body) { 
      done(); 
     }); 
    }); 

});