Запуск тестов Mocha с SailsJS и Superagent

В настоящее время я пишу приложение с использованием SailsJS. То, что было сделано до сих пор, работает, как и ожидалось, при тестировании «вручную», но не при тестировании с Mocha.

Я попытался следовать руководству по тестированию SailsJS, вызвав тест с помощью npm:

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

Структура моего тестового каталога выглядит следующим образом:

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);
    });
  });
});

Наконец, вот мой вывод, когда я вызываю npm test:

> [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.

Подводя итог, я тестирую auth/unauth API. Ниже приведены политики:

  • Когда вошедший в систему пользователь пытается войти в систему, политика «не прошедшая проверку подлинности» должна выдавать ошибку (401).
  • Когда вошедший в систему пользователь пытается зарегистрироваться, политика «не прошедшая проверку подлинности» должна выдавать ошибку (401).
  • Когда пользователь, вышедший из системы, пытается выйти из системы, политика «аутентифицированный» должна выдавать ошибку (401).

Может быть я что-то делаю не так, но я действительно не могу понять, что это такое. Не могли бы вы помочь решить эту проблему?

Если вам нужна дополнительная информация, пожалуйста, спросите. Вы можете найти код (без тестов, поскольку они не работают) на Github.

Спасибо за чтение, хорошего дня!

ОБНОВЛЕНИЕ

Благодаря elsaar я изменил свой код на:

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);
    });
  });
});

person fwoelffel    schedule 21.07.2015    source источник


Ответы (1)


Я думаю, что сеанс не сохраняется, поэтому пользователь, с которым вы вошли в систему в более раннем запросе, не будет входить в систему в более позднем запросе. Какими должны быть модульные тесты. Таким образом, вам нужно будет убедиться, что пользователь находится в желаемом состоянии (вошел в систему или вышел из нее) до запуска теста.

РЕДАКТИРОВАНИЕ. Для сохранения сеанса необходимо использовать тот же экземпляр агента супертестирования — https://github.com/visionmedia/supertest/issues/46#issuecomment-58534736

Так что просто сделайте это в начале своих тестов и используйте один и тот же агент во всех тестах.

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

// the use the agent to test your endpoints
person elssar    schedule 21.07.2015
comment
Это то, что я искал. Спасибо! - person fwoelffel; 21.07.2015