Node js超测是异步的?
Node js supertest is async?
我想为某些路由编写一些测试,我想做这样的事情:
var should = require('should');
var app = require('../../app');
var request = require('supertest');
describe('Create and check that the create was successfull', function() {
var user_id = '';
it('should add a new case and return a JSON array', function(done) {
var newUser = {nume : 'Test', prenume: 'test', varsta : 23};
request(app)
.post('/api/new_user')
.send(newUser)
.expect(201)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
res.body.should.be.instanceOf(Array);
res.body.should.have.property('_id');
user_id = res.body._id;
done();
});
});
it('should return the new user ', function(done) {
request(app)
.get('/api/new_user/' + user_id)
.expect(200)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
res.body.should.be.instanceOf(Object);
res.body._id.should.be.exactly(user_id);
done();
});
});
});
我不确定这两个 it 语句是一个接一个执行,还是每个语句都是异步完成的,当我到达第二个时,第一个没有执行,所以它会失败,因为插入没有完成在服务器中。
我应该使用 async.series 吗?
在您的示例中,超级测试仅负责从 request(app)
向下的链,因此它实际上是 describe()
和 it()
调用的提供者来确定顺序或缺少顺序,其中执行您的测试,我猜是 mocha,对吧?
如果是这样,Mocha 将 运行 按顺序测试您的测试用例(例如,第一个完成后将调用第二个)。
Supertest request 无法保持会话因此您的第二个测试用例似乎失败了。基本上是第二种情况 运行 因为它根本不知道第一种情况。
您可以使用 request.agent 保持您的会话。
下面是一个简单的例子:
var should = require('should');
var app = require('../../app');
var request = require('supertest');
describe('Create and check that the create was successfull', function() {
var session;
var new_user = {name:'Test',presume:'test',vast:'23'};
var user_id;
before (function(done){
session = request.agent(app);
session
.post('/api/new_user')
.send('new_user')
.expect(201)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
res.body.should.be.instanceOf(Array);
res.body.should.have.property('_id');
user_id = res.body._id;
done();
});
});
it('should return the new user ', function(done){
session
.get('/api/new_user/' + user_id)
.expect(200)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
res.body.should.be.instanceOf(Object);
res.body._id.should.be.exactly(user_id);
done();
});
});
...
});
我想为某些路由编写一些测试,我想做这样的事情:
var should = require('should');
var app = require('../../app');
var request = require('supertest');
describe('Create and check that the create was successfull', function() {
var user_id = '';
it('should add a new case and return a JSON array', function(done) {
var newUser = {nume : 'Test', prenume: 'test', varsta : 23};
request(app)
.post('/api/new_user')
.send(newUser)
.expect(201)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
res.body.should.be.instanceOf(Array);
res.body.should.have.property('_id');
user_id = res.body._id;
done();
});
});
it('should return the new user ', function(done) {
request(app)
.get('/api/new_user/' + user_id)
.expect(200)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
res.body.should.be.instanceOf(Object);
res.body._id.should.be.exactly(user_id);
done();
});
});
});
我不确定这两个 it 语句是一个接一个执行,还是每个语句都是异步完成的,当我到达第二个时,第一个没有执行,所以它会失败,因为插入没有完成在服务器中。 我应该使用 async.series 吗?
在您的示例中,超级测试仅负责从 request(app)
向下的链,因此它实际上是 describe()
和 it()
调用的提供者来确定顺序或缺少顺序,其中执行您的测试,我猜是 mocha,对吧?
如果是这样,Mocha 将 运行 按顺序测试您的测试用例(例如,第一个完成后将调用第二个)。
Supertest request 无法保持会话因此您的第二个测试用例似乎失败了。基本上是第二种情况 运行 因为它根本不知道第一种情况。
您可以使用 request.agent 保持您的会话。
下面是一个简单的例子:
var should = require('should');
var app = require('../../app');
var request = require('supertest');
describe('Create and check that the create was successfull', function() {
var session;
var new_user = {name:'Test',presume:'test',vast:'23'};
var user_id;
before (function(done){
session = request.agent(app);
session
.post('/api/new_user')
.send('new_user')
.expect(201)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
res.body.should.be.instanceOf(Array);
res.body.should.have.property('_id');
user_id = res.body._id;
done();
});
});
it('should return the new user ', function(done){
session
.get('/api/new_user/' + user_id)
.expect(200)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
res.body.should.be.instanceOf(Object);
res.body._id.should.be.exactly(user_id);
done();
});
});
...
});