使用 mocha 单元测试异步瀑布
unit testing async-waterfall using mocha
我正在使用 Mocha 作为我的 node.js 应用程序的测试框架。
我有一个使用异步瀑布节点的现有模块module.I我正在尝试为其编写一个单元测试用例。我无法为数组中的第二个函数编写测试用例。关于如何将一个函数的结果传递给数组中的下一个函数的任何提示
var async = require('async');
module.exports.resetPassword = function(req,res,next){
async.waterfall([
function(done){
var token = do something;
done(err,token);
},
function(token,done){
//do some stuff
res.status(200).send('success');
},
]function(err){
//send failure response
});
};
我的代码如下。我的问题是为此方法编写单元测试用例。我正在使用 mocha 和 sinon 进行存根。我写的单元测试是
单元测试
it("Should return an error if there is an error in retrieving the user details from the db",function(done)
{
request={
body:{
email:'test@test.com'
}
};
var expectedMessageFromCrypto = '12121212121';
var cryptoStub = sinon.stub(crypto, "randomBytes",function(err,callback){
callback(null,expectedMessageFromCrypto);
});
user.resetPassword(request,response,next);
cryptoStub.restore();
done();
});
});
重置密码模块
methods.exports.resetPassword = function (req, res, next) {
var token = null;
async.waterfall([
function (done) {
crypto.randomBytes(16, function (err, buf) {
if(err){
return res.status(400);
}
else{
token = buf.toString('hex');
}
done(err, token);
});
},
function (token, done) {
var user = getUserInformation(req.body.email);
sendEmail(user, done);
}
], function (err) {
if (err) {
logger.error('error in sending confirmation mail');
return next(err);
}
res.status(200).send('success');
});
};
我想我现在明白了这个问题。
在您的测试中 - 您执行以下行:
user.resetPassword(request,response,next);
紧接着 - 行:
cryptoStub.restore();
问题是 - async.waterfall 将启动第一个方法,但在 运行 启动第二个方法之前,它将 运行 单元测试的下一行,并且因此你看不到下一个方法。解决该问题的代码如下:
user.resetPassword(request,response,function(err) {
cryptoStub.restore();
done();
});
好看吗?
我正在使用 Mocha 作为我的 node.js 应用程序的测试框架。
我有一个使用异步瀑布节点的现有模块module.I我正在尝试为其编写一个单元测试用例。我无法为数组中的第二个函数编写测试用例。关于如何将一个函数的结果传递给数组中的下一个函数的任何提示
var async = require('async');
module.exports.resetPassword = function(req,res,next){
async.waterfall([
function(done){
var token = do something;
done(err,token);
},
function(token,done){
//do some stuff
res.status(200).send('success');
},
]function(err){
//send failure response
});
};
我的代码如下。我的问题是为此方法编写单元测试用例。我正在使用 mocha 和 sinon 进行存根。我写的单元测试是
单元测试
it("Should return an error if there is an error in retrieving the user details from the db",function(done)
{
request={
body:{
email:'test@test.com'
}
};
var expectedMessageFromCrypto = '12121212121';
var cryptoStub = sinon.stub(crypto, "randomBytes",function(err,callback){
callback(null,expectedMessageFromCrypto);
});
user.resetPassword(request,response,next);
cryptoStub.restore();
done();
});
});
重置密码模块
methods.exports.resetPassword = function (req, res, next) {
var token = null;
async.waterfall([
function (done) {
crypto.randomBytes(16, function (err, buf) {
if(err){
return res.status(400);
}
else{
token = buf.toString('hex');
}
done(err, token);
});
},
function (token, done) {
var user = getUserInformation(req.body.email);
sendEmail(user, done);
}
], function (err) {
if (err) {
logger.error('error in sending confirmation mail');
return next(err);
}
res.status(200).send('success');
});
};
我想我现在明白了这个问题。 在您的测试中 - 您执行以下行:
user.resetPassword(request,response,next);
紧接着 - 行:
cryptoStub.restore();
问题是 - async.waterfall 将启动第一个方法,但在 运行 启动第二个方法之前,它将 运行 单元测试的下一行,并且因此你看不到下一个方法。解决该问题的代码如下:
user.resetPassword(request,response,function(err) {
cryptoStub.restore();
done();
});
好看吗?