2017-10-12 192 views
0

我很努力地找到一種方法來單元測試貓鼬領域的驗證。目前,我有如下測試:單元測試貓鼬驗證承諾解決/拒絕

it('should be invalid if googleId is empty',() => 
    testBook.googleId = ''; 
    const newBook = new Book(testBook); 
    return newBook.validate().catch((err) => { 
    should.exist(err.errors.googleId); 
    }); 
}); 

如預期,因爲,如果我有googleId正確的驗證,測試將通過,因爲它會斷言err.errors.googleId存在這個測試是不工作的,但如果我不對googleId有任何驗證,它也會通過,因爲.catch()永遠不會被調用,並且假定測試正在通過。

我試圖把should.fail()一個.then()裏面,但這樣它總是在.catch()但使用不同的錯誤結束了,如果沒有確認將與should.fail()錯誤被逮住,如果有確認將與模型趕上驗證錯誤。

什麼是實現這種測試的最佳方式?

非常感謝!

編輯: 我使用的newBook.validate()回調試圖和它的作品,但我從來沒有使用回調模型的方法,我總是傾向於使用的承諾,所以我應該使用回調在這種特殊情況下或仍有使用承諾處理它的更好方法是什麼?

回答

2

可以使用第二個參數,然後,把一些在第一例如拋出:

return newBook.validate().then(
    resp => throw new Error("Test failed this should not resolve"), 
    err => should.exist(err.errors.googleId); 
}); 

所以,現在如果newBook.validate()沒有拒絕會導致測試失敗。由於您沒有使用catch(),因此不要阻止它導致測試失敗。如果承諾被拒絕,就應該通過你的測試(假設它符合設定的條件)。這是有效的,因爲不像catch()then()的錯誤回調不會捕獲then()中引發的錯誤。當然,你可以在第一個回調中加入任何東西,例如assert.fail()或任何你的圖書館都有的錯誤。

+0

哦,那太棒了,我不知道'then()'第二個回調函數,現在我在第一個回調函數中返回should.fail(),並在第二個回調函數中聲明它,並且所有的作品很棒:D非常感謝! –

1

有一個chai-as-promised插件,其中包括助手使Promise測試工作更像普通的期望/應該做的。

.rejectedWith.rejected處理錯誤,很像常規.throw

const chai = require('chai') 
chai.should() 
chai.use(require('chai-as-promised')) 

it('should be invalid if googleId is empty', function(){ 
    testBook.googleId = '' 
    const newBook = new Book(testBook) 
    return newBook.validate() 
    .should.be.rejectedWith('Validation Failed') 
    .and.eventually.have.nested.property('errors.googleId') 
}); 

只要確定如果要加載任何其他chai plugins否則事情就會失控加載最後的插件。