摩卡testing,链接超级要求

所以我试图在我的快速应用程序中testing一个路线,为了做到这一点,我需要先login一个user然后再打我的电话。 我在beforeEach函数中创build并保存一个user 。 这是我写的testing:

 it('should update username', function(done){ var _this = this; req.post('/login') .send(_this.data) .then(function(res){ req.put('/users/' + res.body.user._id) .send({ username: 'robert'}) .expect(200) .end(function(err, res){ if(err) return done(err); console.log(res.body); res.body.success.should.equal(true); res.body.user.username.should.match(/robert/); done(); }); }); }); 

这是我运行testing时得到的输出:

  Users Routes Authenticated POST /login 200 195.059 ms - 142 PUT /users/568a432e1daa24083fa6778a 401 2.785 ms - 21 1) should update username Unauthenticated GET /users 401 1.502 ms - 21 ✓ should return 401 1 passing (516ms) 1 failing 1) Users Routes Authenticated should update username: Error: expected 200 "OK", got 401 "Unauthorized" at Test._assertStatus (node_modules/supertest/lib/test.js:232:12) at Test._assertFunction (node_modules/supertest/lib/test.js:247:11) at Test.assert (node_modules/supertest/lib/test.js:148:18) at Server.assert (node_modules/supertest/lib/test.js:127:12) at net.js:1273:10 

我很困惑为什么它在401响应,当POST /login请求响应200

使用Postman我能够创build一个user ,作为该用户login,并与一个PUT请求我能够成功地更新数据。 所以,我认为这与supertestreq链接有关。

我已经使用supertest-as-promised写了请求链接。

据我所知,以下代码的行为与使用then()语法相同:

 it('should update username', function(done){ var _this = this; req.post('/login') .send(_this.data) .endfunction(err, res){ if(err) return done(err); req.put('/users/' + res.body.user._id) .send({ username: 'robert'}) .expect(200) .end(function(err, res){ if(err) return done(err); console.log(res.body); res.body.success.should.equal(true); res.body.user.username.should.match(/robert/); done(); }); }); }); 

我对这里发生的事情感到困惑。 就像我说的那样,我可以使用Postman来做到这一点,所以我认为,这是请求链如何工作的一个问题。 如果你需要更多的上下文,我可以提供更多的代码,如果需要。

解决scheme和改变一样简单

var req = require('supertest-as-promised')(app);

var req = require('supertest-as-promised').agent(app);

调用supertest.agent允许supertest作为Web会话工作,并在链接请求时保留会话,cookie和头文件。

这里是我使用supertest代理的一些代码;

 /* Authentication tests */ process.env.NODE_ENV = 'test' var should = require('should'), app = require('../main.js'), supertest = require('supertest') describe('authentication', function(){ // I expose the webapp (express) on an object called app that is exported from main.js var agent = supertest.agent(app.webapp) before(function(cb){ // Create a user (I expose my models on an object called app) var User = app.models.User var adminUser = new User({ username : 'admin', password : 'admin', role : 'admin' }) adminUser.save(function(err, _admin){ should.not.exist(err) should.exist(_admin) cb() }) }) describe('invalid user', function(){ it('fail to login', function(cb){ agent.post('/api/v1/login').send({ username : 'NEONE', password : '123'}).end(function(err,res){ should(res.status).equal(401) // Unauthorised cb() }) }) it('is not logged in', function(done){ agent.get('/api/v1/loggedin').end(function(err, res){ res.body.should.equal('0') done() }) }) }) describe('valid user', function(){ it('should be able to login', function(done){ agent.post('/api/v1/login').send({ username : 'admin', password : 'admin'}).end(function(err,res){ should(res.status).equal(200) // Authorised done() }) }) it('should be logged in', function(done){ agent.get('/api/v1/loggedin').end(function(err, res){ should.not.exist(err) res.status.should.equal(200) res.body.username.should.equal('admin') done() }) }) it('should be able to logout', function(done){ agent.get('/api/v1/logout').end(function(err, res){ res.status.should.equal(200) done() }) }) it('should not be logged in', function(done){ agent.get('/api/v1/loggedin').end(function(err, res){ res.body.should.equal('0') done() }) }) }) })