Выполнение тестов 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.

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

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

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

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

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

UPDATE

Благодаря 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);
    });
  });
});
7 голосов | спросил FWoelffel 21 J000000Tuesday15 2015, 09:27:10

0 ответов


Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132