用SailsJS和Superagent运行摩卡testing

我目前正在使用SailsJS编写一个应用程序。 到目前为止所做的工作都是按照“手动”进行testing,但是在使用Mocha进行testing时没有发生。

我试图按照SailsJStesting指南 ,用npm调用testing:

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

我的testing目录结构如下:

 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: 'foo@bar.com', 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: 'bar@foo.com', 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: 'foo@bar.com', 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: 'foo@bar.com', password: 'foobar' }) .expect(401, done); }); }); }); 

最后,当我打电话给npmtesting时,这里是我的输出:

 > sails@0.0.0 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 foo@bar.com 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 bar@foo.com. ✓ 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 foo@bar.com. info: foo@bar.com 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 foo@bar.com. info: foo@bar.com 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. 

总结一下,我正在testing一个auth / unauth API。 以下是政策:

  • 当login的用户尝试login时,“未经身份validation的”策略应该引发错误(401)
  • 当login用户尝试注册时,“未authentication”策略应该会引发错误(401)
  • 当注销的用户尝试注销时,“已authentication”策略应该抛出错误(401)

我可能做错了什么,但我真的不知道它是什么。 你能帮忙解决这个问题吗?

如果您需要更多信息,请询问。 你可能会在Github上find代码(没有testing,因为它们失败了)。

感谢您的阅读,祝您有个美好的一天!

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: 'foo@bar.com', 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: 'bar@foo.com', password: 'barfoo' }) .expect(404, done) }); }); describe('#login()', function() { it('should log in an user', function (done) { agent .put('/user/login') .send({ email: 'foo@bar.com', 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: 'foo@bar.com', password: 'foobar' }) .expect(401, done); }); }); }); 

我认为这个会话没有被保存,所以你以前的请求login的用户不会在以后的请求中login。 unit testing应该是这样的。 因此,在testing运行之前,您必须确保用户处于期望的状态(login或退出)。

编辑 – 你需要使用supertest代理的同一个实例来坚持你的会话 – https://github.com/visionmedia/supertest/issues/46#issuecomment-58534736

所以,只要在testing开始时做这件事,并在所有testing中使用相同的代理

 var supertest = require('supertest'); agent = supertest.agent(sails.hooks.http.app); // the use the agent to test your endpoints