2013-10-04 87 views
0

我有麻烦试图在我的摩卡单元测试使用assert.throws,assert.throws异步方法

我有这样的方法:

var getMetadatas = function (file, callback) { 
    fs.readFile(file, {encoding: 'utf-8'}, function(err, data){ 
    // stuff 
     if (somethingWentWrong) 
     throw new Error('Something went wrong') 
    // callback call 
    }) 
} 

而且在我的单元测试我有:

it('should throw an error when passing a bad formatted file', function(){ 
    assert.throws(
    getMetadatas('someBadFormattedFile', function(metadatas){}) 
) 
}) 

我得到的结果是随机的,有时会出现错误(我得到Uncaught Error: something went wrong),测试失败,有时会通过。

我已经尝试了一些其他的事情,比如传递错误通过回调做:

var fn = function(){ 
    parse.getMetadatas('test/test_incorrect.md', function (err, metas) { 
     if (err) throw err 
    }) 
} 
assert.throws(function() { fn() }, Error) 

而且我得到的输出:AssertionError: Missing expected exception (Error)..,所以我想他没有看到什么...

我可以得到assert.throws工作如我所料的唯一方法是具有同步功能:

assert.throws(
    function() {throw new Error('error')} 
) 

我在想,如果它不得不做一些事情done(),但仍然通过在我的回调中调用它,但没有成功。我错过了什么?

+0

assert.throws不适用于异步引发的异常。 –

回答

0

我设法通过改进David Norman的答案来实现它。正如我在我的问题中所述,我的测试缺少done()调用,但即使我在throw err之后调用它,我也遇到了Mocha超时异常。无论如何,这是我用我写了另一个异步方法的测试代码片段,并把它传递并没有得到一个超时错误:

var fn = function() { 
    fs.rmrf(path.join(pathDir, 'non', 'existing'), function (err) { 
    done() 
    assert.ifError(err) 
    }) 
} 
assert.throws(function() { fn() } , /No directory/) 

/No directory/错误的文字说明相匹配被扔在fn回调。它可能是Error,但我想确定至极错误assert.throws正在检测。

2

这是正确的代码

var fn = function(){ 
    parse.getMetadatas('test/test_incorrect.md', function (err, metas) { 
     if (err) throw err 
    }) 
} 
assert.throws(function() { fn() }, Error) 

消息

AssertionError: Missing expected exception (Error).. 

说,错误类型的异常被抛出。你不会说你正在使用哪个断言,但可能是assert.Throws中的'Error'指定了预期的异常类型。您需要更改它以匹配抛出的实际异常。

我想这也可能是消息说没有异常实际上被抛出。你需要检查你的库的文档或者写一个简单的测试来检查什么是错的。

+0

根据文档,“错误”代表“任何错误”。但是,我使用该代码时遇到的问题不是关于不会抛出的错误。它实际上按预期工作,但'assert.throws()'无法捕捉它,并不断告诉我'缺少预期的异常'。我认为这是因为我的方法的异步性质,所以我在'throw err'之后在它的回调函数中添加了'done()',强制'assert.throws'等待,但它没有效果,它仍然没有检测到错误。为了解决它,我切换到同步方法,它的工作原理,感谢您的答案。 – thibaultcha