4

我正在使用 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 中)有效
*可以随意强制任何错误
*不改变函数签名
*能够强制特定函数失败,这在以下情况下非常有用测试依赖多个从属函数的大型函数的错误处理

缺点
*我必须用 get 和 mange_return 将所有异步函数重写为对象
*如果函数在模块中,我必须导出函数才能重写/恢复它

想法?

4

0 回答 0