2016-03-19 5 views
0

Meine APIs verwendet werden können nach der Anmeldung. Zum Beispiel /api/sales eine Authentifizierung wie unten Code erfordert. (Ich verwende Node.js und Express.js)Mokka Testing authentifizierte von einem Server bereitgestellt APIs

app.all('/api/*', userController.requiresLogin); 
app.route('/api/sales') 
    .get(common.readAll(Sale, 'name')) 
    .post(common.create(Sale)); 

Die userController.requiresLogin Funktion ist:

exports.requiresLogin = function(req, res, next) { 
    console.log('Check login...'); 

    if(!req.user) return res.status(401).send(); 
    else next(); 
}; 

anzumelden, verwende ich passport.js.

Wenn ich meinen Server ausführen und diese API in meinem Browser testen, funktioniert es.

Um diese API automatisch zu testen, habe ich meinen Mokka-Testcode mit Supertest erstellt.

var request = require('supertest'), 
     should = require('should'), 
     utils = require('./../utils'), 
     mongoose = require('mongoose'); 

    var Sale = mongoose.model('Sale'), 
     User = mongoose.model('User'); 

    var user; 

    describe('Controller Testing:', function() { 
     describe('Sale Controller Testing:', function() { 
      var agent = request.agent(); 

      beforeEach(function(done) { 
       user = new User({ 
        username:'[email protected]', 
        password: 1234, 
        userId: 'default user' 
       }); 
       user.save(); 

       request(app).post('/login') 
        .send({username: '[email protected]', password: '1234'}) 
        .end(function(err, res) { 
         should.not.exist(err); 
         agent.saveCookies(res); 
         done(); 
        }); 
      }); 

      afterEach(function() { 
       User.remove({}, function(){}); 
       Sale.remove({}, function(){}); 
      } 

      it('create a sale', function(done) { 
       var sale = { 
        name: 'New Sale', 
        orders: [order1] 
       }; 

       var req = request(app).post('/api/sales') 
        .send(sale) 
        .expect('Content-Type', /json/) 
        .expect(200); 
       agent.attachCookies(req); 

       req.end(function(err, res) { 
        console.log(res.statusCode); 

        res.body.name.should.equal('New Sale'); 
        done(); 
       }); 
      }); 
    } 

Dieser Test gescheitert hält. Der Test "Verkauf erstellen" kann nicht erkennen, dass sich ein Benutzer angemeldet hat, obwohl ich entsprechende Cookies gespeichert und angehängt habe.

Antwort

2

prüfen supertest npm page und revidieren Sie Ihre Testskript als

var request = require('supertest'), 
    should = require('should'), 
    utils = require('./../utils'), 
    mongoose = require('mongoose'); 

var Sale = mongoose.model('Sale'), 
    User = mongoose.model('User'); 

var user; 

describe('Controller Testing:', function() { 
    describe('Sale Controller Testing:', function() { 
     var agent = request.agent(app); // revised 

     beforeEach(function(done) { 
      user = new User({ 
       username:'[email protected]', 
       password: 1234, 
       userId: 'default user' 
      }); 
      user.save(); 

      agent.post('/login') // revised 
       .send({username: '[email protected]', password: '1234'}) 
       .expect("set-cookie", "check correct cookie here") // appended 
       .end(function(err, res) { 
        should.not.exist(err); 
        //agent.saveCookies(res); 
        // or write some code to check your cookie here 
        done(); 
       }); 
     }); 

     afterEach(function() { 
      User.remove({}, function(){}); 
      Sale.remove({}, function(){}); 
     } 

     it('create a sale', function(done) { 
      var sale = { 
       name: 'New Sale', 
       orders: [order1] 
      }; 

      var req = agent.post('/api/sales') // revised 
       .send(sale) 
       .expect('Content-Type', /json/) 
       .expect(200); 
      //agent.attachCookies(req); 

      req.end(function(err, res) { 
       console.log(res.statusCode); 

       res.body.name.should.equal('New Sale'); 
       done(); 
      }); 
     }); 
} 

Ich sehe nicht, wo app von im Testskript kommen ist, vorausgesetzt, dass Sie es richtig bekam und angewendet cookieParser Middleware.

Ich denke, das Problem in Ihrem Testskript ist Anfrage nur vor Cookie gesendet gesendet. Vielleicht können Sie auch versuchen

var req = aggent.attachCookies(request(app)); 
req.post('/api/sales') 
    .send(sale) 
    .expect('Content-Type', /json/) 
    .expect(200); 
    //agent.attachCookies(req); 
+0

Ihre Revision funktioniert! Vielen Dank! Das Problem scheint zu sein, dass mein ursprünglicher Code separate "request (app)" statt des gleichen "agents" macht. – byron1st

Verwandte Themen