我正在使用should.js编写Mongodb数据库的第一个测试,并且需要一种方法来强制执行数据库调用的各种函数中的错误。
我花了一点时间探索Rewire.js可能会有什么帮助,但我仍然对Mongo有足够的新意,我不确定应该重新插入什么来强制数据库错误。
也许有更好的方法来编写函数来在测试期间触发错误。
我很感激任何想法。
对于它的价值,这是我提出的,并感谢任何评论。我没有多久写这篇文章,所以请原谅任何错别字。
具有嵌入式异步调用的函数的典型布局通常类似于:
function my_function(callback) {
async_call(function(err, doc) {
if (err) {
//Do error prep such as with VError
callback(err, null);
} else {
//Do success prep such as:
var result = doc.property;
callback(null, result);
}
});
}
问题是有一个很好的方法来测试错误路径中的代码。有像Rewire这样的解决方案,如果通过更改全局变量的值可以触发所需的错误,但是很难找到通过重写全局来打破Mongodb调用的方法。
我的解决方案是: 1)重写我的异步函数,我需要“破解”才能测试
my_function = {
get: function(callback) {
async_call(function(err, doc) {
my_function.manage_return(err, doc, callback);
});
},
manage_return: function(err, doc, callback) {
if (err) {
//Do error prep such as with VError
callback(err, null);
} else {
//Do success prep such as:
var result = doc.property;
callback(null, result);
}
});
}
2)在测试期间,如果我需要强制错误,我只需重写get:
var original_get = my_lib.my_function.get; //NO parenthesis!!!
my_lib.my_function.get = function(callback) {
my_lib.my_function.manage_return("This is a forced error", null, callback);
};
稍后如果我需要恢复该功能:
my_lib.my_function.get = original_get;
我实际上编写了一个构造函数,使重写/恢复过程更加简化,如果有人有兴趣,我很乐意发帖。
我确实尝试使用Rewire来处理重写/恢复过程但没有成功。更糟糕的是,“重写”代码不能单步执行。
赞成
*不使用eval
*单步调试(至少在WebStorm中)工作
*可随意强制任何错误
*不改变功能签名
*赋予强制特定函数失败的能力,这在测试依赖于多个从属函数的较大函数的错误处理时是一个巨大的帮助
CONS
*我必须使用get和mange_return将所有异步函数重写为对象
*如果函数在模块中,我必须导出函数才能重写/恢复它
思想?