2015-07-21 18 views
6

Attualmente sto scrivendo un'app utilizzando SailsJS. Ciò che è stato fatto fino ad ora funziona come previsto se testato 'manualmente', ma non quando testato con Mocha.Esecuzione di test Mocha con SailsJS e Superagent

ho cercato di seguire SailsJS testing guide, chiamando il test con NPM:

[...] 
"scripts": { 
    "start": "node app.js", 
    "debug": "node debug app.js", 
    "test": "mocha test/bootstrap.test.js test/unit/**/*.test.js" 
}, 
[...] 

La mia prova struttura di directory è la seguente:

test 
├── bootstrap.test.js 
├── mocha.opts 
└── unit 
    └── controllers 
     └── UserController.test.js 

boostrap.test.js:

var Sails = require('sails'); 
var sails; 

before(function(done) { 
    Sails.lift(function(err, server) { 
    sails = server; 
    if (err) return done(err); 
    done(err, sails); 
    }); 
}); 

after(function(done) { 
    Sails.lower(done); 
}); 

UserController.test.js:

var request = require('supertest'); 

describe('UsersController', function() { 

    describe('#logout()', function() { 
    it('should respond with a 401 status because nobody is logged in', function (done) { 
     request(sails.hooks.http.app) 
     .put('/user/logout') 
     .expect(401, done) 
    }); 
    }); 

    describe('#signup()', function() { 
    it('should create and log in an user', function (done) { 
     request(sails.hooks.http.app) 
     .post('/user') 
     .send({ 
      firstname: 'foo', 
      name: 'bar', 
      email: '[email protected]', 
      sex: true, 
      password: 'foobar', 
      birthdate: '01/01/1991', 
      phoneNumber: '+33 3 10 10 10' 
     }) 
     .expect(200, done) 
    }); 
    }); 

    describe('#logout()', function() { 
    it('should log out an user', function (done) { 
     request(sails.hooks.http.app) 
     .put('/user/logout') 
     .expect(200, done) 
    }); 
    }); 

    describe('#login()', function() { 
    it('should respond with a 404 status because credentials are invalid', function (done) { 
     request(sails.hooks.http.app) 
     .put('/user/login') 
     .send({ 
      email: '[email protected]', 
      password: 'barfoo' 
     }) 
     .expect(404, done) 
    }); 
    }); 

    describe('#login()', function() { 
    it('should log in an user', function (done) { 
     request(sails.hooks.http.app) 
     .put('/user/login') 
     .send({ 
      email: '[email protected]', 
      password: 'foobar' 
     }) 
     .expect(200, done); 
    }); 
    }); 

    describe('#login()', function() { 
    it('should respond with a 401 status because user is already logged in', function (done) { 
     request(sails.hooks.http.app) 
     .put('/user/login') 
     .send({ 
      email: '[email protected]', 
      password: 'foobar' 
     }) 
     .expect(401, done); 
    }); 
    }); 
}); 

Infine, ecco la mia uscita quando chiamo NPM prova:

> [email protected] test /Users/fwoelffel/Dev/STOFMA 
> mocha test/bootstrap.test.js test/unit/**/*.test.js 



    UsersController 
    #logout() 
debug: false 
debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} 
info: Policy 'authenticated' disallowed to proceed to the next policy 
     ✓ should respond with a 401 status because nobody is logged in (86ms) 
    #signup() 
debug: null === req.session.authenticated || undefined === req.session.authenticated -> true 
debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} 
info: Policy 'unauthenticated' allowed to proceed to the next policy 
info: User [email protected] signed up and logged in. 
     ✓ should create and log in an user (146ms) 
    #logout() 
debug: false 
debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} 
info: Policy 'authenticated' disallowed to proceed to the next policy 
     1) should log out an user 
    #login() 
debug: null === req.session.authenticated || undefined === req.session.authenticated -> true 
debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} 
info: Policy 'unauthenticated' allowed to proceed to the next policy 
info: No user matching [email protected] 
     ✓ should respond with a 404 status because credentials are invalid (66ms) 
    #login() 
debug: null === req.session.authenticated || undefined === req.session.authenticated -> true 
debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} 
info: Policy 'unauthenticated' allowed to proceed to the next policy 
info: Found user [email protected] 
info: [email protected] credentials are valid. 
     ✓ should log in an user (128ms) 
    #login() 
debug: null === req.session.authenticated || undefined === req.session.authenticated -> true 
debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} 
info: Policy 'unauthenticated' allowed to proceed to the next policy 
info: Found user [email protected] 
info: [email protected] credentials are valid. 
     2) should respond with a 401 status because user is already logged in 


    4 passing (1s) 
    2 failing 

    1) UsersController #logout() should log out an user: 
    Error: expected 200 "OK", got 401 "Unauthorized" 
     at net.js:1419:10 

    2) UsersController #login() should respond with a 401 status because user is already logged in: 
    Error: expected 401 "Unauthorized", got 200 "OK" 
     at net.js:1419:10 



npm ERR! Test failed. See above for more details. 

In sintesi le cose, sto testando un auth/API unauth. Un seguito sono le politiche:

  • Quando un utente collegato cerca di login, la politica 'non autenticato' dovrebbe generare un errore (401)
  • Quando un login utente tenta di firmare, il 'non autenticato 'politica dovrebbe generare un errore (401)
  • Quando un utente disconnesso prova ad uscire, la 'politica di autenticato' dovrebbe generare un errore (401)

potrei fare qualcosa di sbagliato, ma io davvero possibile capisco di cosa si tratta Potresti aiutare a risolvere questo problema?

Se avete bisogno di ulteriori informazioni, si prega di chiedere. È possibile trovare il codice (senza i test, poiché non stanno funzionando) on Github.

Grazie per la lettura, buona giornata!

UPDATE

Grazie a elsaar, ho cambiato il mio codice per:

var request = require('supertest'); 
var agent; 

describe('UsersController', function() { 

    before(function(done) { 
    agent = request.agent(sails.hooks.http.app); 
    done(); 
    }) 

    describe('#logout()', function() { 
    it('should respond with a 401 status because nobody is logged in', function (done) { 
     agent 
     .put('/user/logout') 
     .expect(401, done) 
    }); 
    }); 

    describe('#signup()', function() { 
    it('should create and log in an user', function (done) { 
     agent 
     .post('/user') 
     .send({ 
      firstname: 'foo', 
      name: 'bar', 
      email: '[email protected]', 
      sex: true, 
      password: 'foobar', 
      birthdate: '01/01/1991', 
      phoneNumber: '+33 3 10 10 10' 
     }) 
     .expect(200, done) 
    }); 
    }); 

    describe('#logout()', function() { 
    it('should log out an user', function (done) { 
     agent 
     .put('/user/logout') 
     .expect(200, done) 
    }); 
    }); 

    describe('#login()', function() { 
    it('should respond with a 404 status because credentials are invalid', function (done) { 
     agent 
     .put('/user/login') 
     .send({ 
      email: '[email protected]', 
      password: 'barfoo' 
     }) 
     .expect(404, done) 
    }); 
    }); 

    describe('#login()', function() { 
    it('should log in an user', function (done) { 
     agent 
     .put('/user/login') 
     .send({ 
      email: '[email protected]', 
      password: 'foobar' 
     }) 
     .expect(200, done); 
    }); 
    }); 

    describe('#login()', function() { 
    it('should respond with a 401 status because user is already logged in', function (done) { 
     agent 
     .put('/user/login') 
     .send({ 
      email: '[email protected]', 
      password: 'foobar' 
     }) 
     .expect(401, done); 
    }); 
    }); 
}); 

risposta

4

Credo che la sessione non è persistente, quindi un l'utente che si loggedin in una richiesta precedente non lo farà essere registrato in una richiesta successiva. Qual è il modo in cui i test unitari dovrebbero essere. Quindi dovrai assicurarti che l'utente sia nel dichiarato (connesso o disconnesso) prima dell'esecuzione del test.

EDIT - È necessario utilizzare la stessa istanza dell'agente Supertest a persistere la sessione - https://github.com/visionmedia/supertest/issues/46#issuecomment-58534736

Quindi, solo fare questo all'inizio del vostro test, e utilizzare lo stesso agente in tutti i test

var supertest = require('supertest'); 
    agent = supertest.agent(sails.hooks.http.app); 

// the use the agent to test your endpoints 
+0

Questo è quello che stavo cercando. Grazie! – FWoelffel