2013-10-04 109 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