How do i test my express app with mocha?

前端 未结 5 474
被撕碎了的回忆
被撕碎了的回忆 2020-12-22 18:55

I\'ve just added shouldjs and mocha to my express app for testing, but I\'m wondering how to test my application. I would like to do it like this:

app = requ         


        
5条回答
  •  北海茫月
    2020-12-22 19:18

    I've found it's easiest to set up a TestServer class to be used as a helper, as well as a helper http client, and just make real requests to a real http server. There may be cases where you want to mock and stub this stuff instead though.

    // Test file
    var http = require('the/below/code');
    
    describe('my_controller', function() {
        var server;
    
        before(function() {
            var router = require('path/to/some/router');
            server = http.server.create(router);
            server.start();
        });
    
        after(function() {
            server.stop();
        });
    
        describe("GET /foo", function() {
            it('returns something', function(done) {
                http.client.get('/foo', function(err, res) {
                    // assertions
                    done();
                });
            });
        });
    });
    
    
    // Test helper file
    var express    = require('express');
    var http       = require('http');
    
    // These could be args passed into TestServer, or settings from somewhere.
    var TEST_HOST  = 'localhost';
    var TEST_PORT  = 9876;
    
    function TestServer(args) {
        var self = this;
        var express = require('express');
        self.router = args.router;
        self.server = express.createServer();
        self.server.use(express.bodyParser());
        self.server.use(self.router);
    }
    
    TestServer.prototype.start = function() {
        var self = this;
        if (self.server) {
            self.server.listen(TEST_PORT, TEST_HOST);
        } else {
            throw new Error('Server not found');
        }
    };
    
    TestServer.prototype.stop = function() {
        var self = this;
        self.server.close();
    };
    
    // you would likely want this in another file, and include similar 
    // functions for post, put, delete, etc.
    function http_get(host, port, url, cb) {
        var options = {
            host: host,
            port: port,
            path: url,
            method: 'GET'
        };
        var ret = false;
        var req = http.request(options, function(res) {
            var buffer = '';
            res.on('data', function(data) {
                buffer += data;
            });
            res.on('end',function(){
                cb(null,buffer);
            });
        });
        req.end();
        req.on('error', function(e) {
            if (!ret) {
                cb(e, null);
            }
        });
    }
    
    var client = {
        get: function(url, cb) {
            http_get(TEST_HOST, TEST_PORT, url, cb);
        }
    };
    
    var http = {
        server: {
            create: function(router) {
                return new TestServer({router: router});
            }
        },
    
        client: client
    };
    module.exports = http;
    

提交回复
热议问题