我使用supertest和mocha来测试nodejs应用程序。用户可以做的一件事就是提交一个非常简单的表单,该表单由节点服务器选取并使用强大的功能进行解析。
这是mocha测试代码:
var should = require('should'),
express = require('express'),
app = require('../app.js'),
request = require('supertest'),
csrfToken,
sessionId,
cookies = [];
describe('Post Handler', function(){
it('Uploads new post', function(done){
var req = request(app).post('/post?_csrf=' + csrfToken);
req.cookies = cookies;
req
.type('form')
.send({fieldTitle: 'autopost'})
.send({fieldContent: 'autocontent'})
.send({contentType: 'image/png'})
.send({blobId: 'icon_23943.png'})
.expect(200)
.end(function(error, res){
console.log('here');
done();
});
});
csrfToken 从服务器检索csrf令牌,因为我使用的是csurf模块,每个POST方法都需要一个csrf令牌。 cookies 存储节点服务器提供的会话cookie,以便我可以在请求之间保持会话。
表单由以下代码处理:
//Takes HTTP form posted by client and creates a new post in the Db
exports.postPostUpload = function (req, res) {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
console.log(err);
if (err) res.redirect(303, '/error');
else {
var new_post = new post_model.Post().createNewPost(fields);
new_post.setUserId(req.session.passport.user.userId);
new_post.uploadPostToDb(function (error, result) {
if (error) return res.status(500).end();
else {
if (new_post.media.contentType.indexOf('video') !== -1) {
addMessageToEncodingQueue(new_post, function (error, result, response) {
if (error) {
errorHelper.reportError({
stack: new Error().stack,
error: error
});
res.status(500).end();
}
else res.status(200).send(new_post.cuid);
});
}
else return res.status(200).send(new_post.cuid);
}
});
}
});
}
我当前的问题是,一旦表单处理程序执行行 form.parse(req,function(错误,字段,文件){,就没有任何反应.Tormidable不会返回错误,它只是因此,mocha测试从未收到服务器的回复,最终套接字挂起并且测试崩溃。不用说,如果你通过网站手动完成表单,表单就会成功提交。
supertest / mocha执行此测试的方式必定存在错误,但我无法找到它。任何指针都非常受欢迎。