【发布时间】:2018-01-04 00:00:21
【问题描述】:
我有一个这样的路由处理程序:
router.route('/sipprovider/:sipprovider_id/phonelist')
.post((req, res) => {
const body = req.body;
if (typeof body.phones === 'undefined') {
return res.status(400).json({
success: false,
error: { message: 'Invalid input' }
});
}
if (!Array.isArray(body.phones) || body.phones.length === 0) {
return res.status(400).json({
success: false,
error: { message: 'Invalid input' }
});
}
let i = body.phones.indexOf('');
while (i >= 0) {
body.phones.splice(i, 1);
i = body.phones.indexOf('');
}
body.phones.map((phone) => {
if (typeof phone !== 'string') {
return res.status(400).json({
success: false,
error: { message: 'Invalid input' }
});
}
});
const SipProvider = new SipProviderModel(db, logger);
SipProvider.pushPhoneList(req.params.sipprovider_id, body.phones)
.then((result) => {
if (result) {
return res.json({ success: true });
}
return res.status(404).json({
success: false,
error: { message: 'Sip provider not found' }
});
})
.catch((error) => res.status(400).json({
success: false,
error: { message: error }
}));
});
SipProvider 的pushPhoneList 函数是一个承诺。我写了几个测试:
describe('POST', () => {
let id;
beforeEach(() => SipProvider.create(data).then((result) => id = result._id));
it('Should return 200 if successful', (done) => {
chai.request(app)
.post('/sipprovider/' + id + '/phonelist')
.set('Authorization', token)
.send({ phones: ['02873000050'] })
.end((err, res) => {
expect(res.status).to.equal(200);
expect(res.body.success).to.equal(true);
return done();
});
});
it('Should return 200 if successful', (done) => {
chai.request(app)
.post('/sipprovider/' + id + '/phonelist')
.set('Authorization', token)
.send({ phones: ['02873000050', ''] })
.end((err, res) => {
expect(res.status).to.equal(200);
expect(res.body.success).to.equal(true);
return done();
});
});
it('Should return 400 if input is invalid (undefined phones)', (done) => {
chai.request(app)
.post('/sipprovider/' + id + '/phonelist')
.set('Authorization', token)
.end((err, res) => {
expect(res.status).to.equal(400);
expect(res.body.success).to.equal(false);
expect(res.body.error.message).to.equal('Invalid input');
return done();
});
});
it('Should return 400 if input is invalid (not an array)', (done) => {
chai.request(app)
.post('/sipprovider/' + id + '/phonelist')
.set('Authorization', token)
.send({ phones: '02873000050' })
.end((err, res) => {
expect(res.status).to.equal(400);
expect(res.body.success).to.equal(false);
expect(res.body.error.message).to.equal('Invalid input');
return done();
});
});
it('Should return 400 if input is invalid (empty list)', (done) => {
chai.request(app)
.post('/sipprovider/' + id + '/phonelist')
.set('Authorization', token)
.send({ phones: [] })
.end((err, res) => {
expect(res.status).to.equal(400);
expect(res.body.success).to.equal(false);
expect(res.body.error.message).to.equal('Invalid input');
return done();
});
});
it('Should return 400 if input is invalid (not an array of string)', (done) => {
chai.request(app)
.post('/sipprovider/' + id + '/phonelist')
.set('Authorization', token)
.send({ phones: ['02873000050', {}] })
.end((err, res) => {
expect(res.status).to.equal(400);
expect(res.body.success).to.equal(false);
expect(res.body.error.message).to.equal('Invalid input');
return done();
});
});
it('Should return 404 if not found', (done) => {
SipProvider.delete(id).then(
() => {
chai.request(app)
.post('/sipprovider/' + id + '/phonelist')
.set('Authorization', token)
.send({ phones: ['02873000050'] })
.end((err, res) => {
expect(res.status).to.equal(404);
expect(res.body.success).to.equal(false);
expect(res.body.error.message).to.equal('Sip provider not found');
return done();
});
});
});
afterEach(() => SipProvider.delete(id));
});
它们都通过了,但是记录器在最后一次测试中记录了一些警告,其中包含UnhandledPromiseRejectionWarning: Unhandled promise rejection, Can't set headers after they are sent
我不明白为什么调用路由处理程序中的最终 catch 块。我以为只有当 promise 函数被拒绝时,才会发生 catch
【问题讨论】:
-
想想
body.phones.map((phone) => {中的代码——理论上你可以res.status(400).json({多次...然后继续SipProvider.pushPhoneList(req.params.sipprovider_id, body.phones)无论如何
标签: javascript node.js unit-testing header promise