2016-04-28 10 views
2

Ich bin sehr neu in NodeJS.Ich brauche Hilfe beim Testen einer einfachen API, die ich mit Express erstellen.Test Express Route in Nodejs mit verspottet Modul

Ich habe die folgende Route in meinem API:

router.get('/execute', function(req, res, next) { 
console.log("Execute Request Query: %s", util.inspect(req.query, false, null)); 

// Validate Reqest. gremlin is Mandatory field 
if (req == null || req.query.gremlin == null) { 
    res.status(400).send(getErrorResponse("Invalid Request", "Request is missing mandatory field: gremlin")); 
    return; 
} 

queryDB(req.query.gremlin, res); 
}); 

Diese Route ruft eine gemeinsame Methode queryDB, die einen API-Aufruf an die Titan DB macht mit seiner Restful Schnittstelle. Ich verwende node_module Restler, um diesen API-Aufruf durchzuführen.

Jetzt möchte ich den "Ausführen" Endpunkt meiner API testen. Ich bin in der Lage, dies mit folgenden zu tun:

var www = require("../bin/www"); 
var superagent = require('superagent'); 
var expect = require('expect.js'); 
var proxyquire = require('proxyquire'); 

describe('server', function() { 

before(function() { 
    www.boot(); 
}); 

describe('Execute', function() { 
    it('should respond to GET', function(done) { 
     superagent 
      .get('http://localhost:' + www.port + "/gremlin/execute?gremlin=99-1") 
      .end(function(err, res) { 
       expect(res.status).to.equal(200); 
       expect(res.body.data[0]).to.equal(98); 
       done() 
      }) 
    }) 
}); 

after(function() { 
    www.shutdown(); 
}); 
}); 

Allerdings mache ich derzeit Aufruf an meine Datenbank, die ich verspotten muss. Ich habe online einige Beispiele gesehen, die dir helfen, Knotenmodule zu verspotten, die ich verwenden könnte, um "Restler" zu verspotten. Da ich jedoch eine API durch Aufruf des Endpunkts teste, bin ich mir nicht sicher, wie ich ein Modul dafür vortäuschen sollte.

schaute ich auf die folgenden Beispiele: https://stackoverflow.com/a/33773233/2596762 https://www.terlici.com/2015/09/21/node-express-controller-testing.html usw.

Jede Hilfe oder einen Vorschlag zu schätzen wissen. Vielen Dank.

Antwort

0

Ich bin in der Lage, meine API mit nachgeschalteten Systemen zu testen, die nach this SO answer gespottet werden.

Ich bin mir jedoch nicht sicher, ob dies der beste/einzige Weg ist.

0

Der einzige Weg, den ich gefunden habe, ist zu ändern app.use ('/ Benutzer', userRoute); mit userRoute (app):

// file: main.js 
 
var express = require('express'); 
 
var app = express(); 
 
var userRoute = require('./user-route'); 
 

 
// Have user route mount itself to the express application, we could pass 
 
// other parameters too, such as middleware, or the mount path 
 
userRoute(app);

für jede Route Spezialmodul erstellen:

// file: user-route.js 
 
var express = require('express'); 
 
var users = require('./users'); 
 

 
module.exports = function (app) { 
 
    var route = express.Router(); 
 

 
    // Mount route as "/users" 
 
    app.use('/users', route); 
 

 
    // Add a route that allows us to get a user by their username 
 
    route.get('/:username', function (req, res) { 
 
    var user = users.getByUsername(req.params.username); 
 

 
    if (!user) { 
 
     res.status(404).json({ 
 
     status: 'not ok', 
 
     data: null 
 
     }); 
 
    } else { 
 
     res.json({ 
 
     status: 'ok', 
 
     data: user 
 
     }); 
 
    } 
 
    }); 
 
};

Und dann können Sie proxyquire verwenden zu verspotten du bist abhängig gruenzen:

// We'll use this to override require calls in routes 
 
var proxyquire = require('proxyquire'); 
 
// This will create stubbed functions for our overrides 
 
var sinon = require('sinon'); 
 
// Supertest allows us to make requests against an express object 
 
var supertest = require('supertest'); 
 
// Natural language-like assertions 
 
var expect = require('chai').expect; 
 

 
var express = require('express'); 
 

 
describe('GET /ping', function() { 
 
    var app, getUserStub, request, route; 
 

 
    beforeEach(function() { 
 
    // A stub we can use to control conditionals 
 
    getUserStub = sinon.stub(); 
 

 
    // Create an express application object 
 
    app = express(); 
 

 
    // Get our router module, with a stubbed out users dependency 
 
    // we stub this out so we can control the results returned by 
 
    // the users module to ensure we execute all paths in our code 
 
    route = proxyquire('./user-route.js', { 
 
     './users': { 
 
     getByUsername: getUserStub 
 
     } 
 
    }); 
 

 
    // Bind a route to our application 
 
    route(app); 
 

 
    // Get a supertest instance so we can make requests 
 
    request = supertest(app); 
 
    }); 
 

 
    it('should respond with a 404 and a null', function (done) { 
 
    getUserStub.returns(null); 
 

 
    request 
 
     .get('/users/nodejs') 
 
     .expect('Content-Type', /json/) 
 
     .expect(404, function (err, res) { 
 
     expect(res.body).to.deep.equal({ 
 
      status: 'not ok', 
 
      data: null 
 
     }); 
 
     done(); 
 
     }); 
 
    }); 
 

 
    it('should respond with 200 and a user object', function (done) { 
 
    var userData = { 
 
     username: 'nodejs' 
 
    }; 
 

 
    getUserStub.returns(userData); 
 

 
    request 
 
     .get('/users/nodejs') 
 
     .expect('Content-Type', /json/) 
 
     .expect(200, function (err, res) { 
 
     expect(res.body).to.deep.equal({ 
 
      status: 'ok', 
 
      data: userData 
 
     }); 
 
     done(); 
 
     }); 
 
    }); 
 
});

Vielen Dank an Evan Shortiss:

http://evanshortiss.com/development/javascript/2016/04/15/express-testing-using-ioc.html