В настоящее время я пишу приложение с использованием 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);
});
});
});