2017-10-13 63 views
0

我想單元測試與摩卡+ chai + sinon控制器方法,但我努力瞭解斷言如何與這些異步方法工作。下面是我的測試:異步測試從來沒有調用完成()如果斷言失敗

it('should fetch all registered books and send them as json', (done) => { 
    res.json = sandbox.spy(); 
    const books = []; 

    BookMock.expects('find').withArgs() 
    .resolves(books); 

    booksController.index(req, res,() => { 
    res.json.should.have.been.calledWith(200, { data: books }); 
    done(); 
    }); 
}); 

與這個測試的問題是,如果我改變斷言期望的300代替200參數,例如,我的測試將停止(失敗),並永遠不會調用done(),導致一個通用的失敗告訴沒有比'測試失敗,因爲完成從來沒有被稱爲',其中沒有說與測試失敗的原因沒有關係。

如果我保持這樣的測試,並且我的控制器方法做得很好,測試通過並且一切正常,但是如果控制器做了任何錯誤,測試失敗並且不會告訴我失敗的原因(哪個應該是「res.json沒有用bla bla bla參數調用」)。

我也不確定這是單元測試控制器方法的正確方法,因爲它們不會返回Promise我不能使用chai-as-promised或promise鏈,所以我使用了next()回調函數(它總是使用restify調用)來做出斷言,這可能是不對的,所以我打開一個完整的重構來使這個測試最正確。

預先感謝您!

回答

0

挖一點點,我發現其他問題這樣的回答:https://stackoverflow.com/a/26793989/4233017

所以我更新了我的代碼,幷包裹在一個try/catch斷言,結束了像這樣:

it('should fetch all registered books and send them as json', (done) => { 
    res.json = sandbox.spy(); 
    const books = []; 

    BookMock.expects('find').withArgs() 
    .resolves(books); 

    booksController.index(req, res,() => { 
    try { 
     res.json.should.have.been.calledWith(200, { data: books }); 
     done(); 
    } catch (e) { 
     done(e); 
    } 
    }); 
}); 

現在當測試失敗時,它會給我正確的錯誤信息。如果答案是這樣,我也可以用布爾值來做到這一點,但我認爲這樣更好。

任何其他解決方案仍然非常感激。