Chai期望[Function]抛出(错误)不通过测试(使用Node)

时间:2015-03-09 00:11:05

标签: javascript node.js unit-testing mocha chai

问题:

我正在使用Chai进行测试,而我似乎一直在测试预期的错误:

Chai期望[功能]抛出(错误)

当前代码:

以下是测试代码:

describe('Do something', function () {

    it('should remove a record from the table', function (done) {

        storage.delete(ID, done);

    });

    it('should throw an error when the lookup fails', function () {

         expect(storage.delete.bind(storage, ID)).to.throw('Record not found');
    });
});

这是函数的代码:

delete: function (id, callback) {
    //  Generate a Visitor object
    visitor = new Visitor(id);

    /*  Delete the visitor that matches the queue an
        cookie provided. */
    tableService.deleteEntity(function (error, response) {

        //  If successful, go on.
        if (!error) {
            // Do something on success.
        }
        //  If unsuccessful, log error.
        else {
            if (error.code === 'ResourceNotFound') {
                throw new Error('Record not found');
            }

            //  For unexpected errros.
            else {

                throw new Error('Table service error (delete): ' + error);

            }
        }
        if (callback) callback();
    });

},

尝试解决方案:

我尝试过调用expect函数的多种变体(包括调用匿名函数:

expect(function() {storage.delete(ID);}).to.throw('Record not found');

绑定,如示例中所示,

的基本内容
expect(storage.delete(ID)).to.throw('Record not found');

我还尝试将“未找到记录”中的throw参数替换为多个内容,包括将输入定向到已创建的错误(错误),并在参数中创建新错误(新错误('找不到记录) “));

可能的原因:

我怀疑错误没有被抛出,因为测试需要一段时间才能与数据库通信以删除记录,但是我不确定如何解决这个问题。

此外,似乎在此之后运行的测试实际上返回了应该在此测试中返回的错误。

1 个答案:

答案 0 :(得分:1)

鉴于(来自评论)tableService.deleteEntity是异步的,不可能测试throw。代码本身无效。因为抛出的异常不会被捕获,所以它将被处理,因为它被抛入不同的刻度。详细了解Asynchronous error handling in JavaScriptunhandled exceptions in Node.js

换句话说,这样的函数无法测试抛出错误:

function behaveBad(){
    setTimeout(function(){
        throw new Error('Bad. Don\'t do this');
    }, 50);
}