2016-09-06 19 views
0

考慮以下規格:的Javascript規格:承諾鏈,省略預期

describe('User',() => { 
    it('requires username', done => { 
    factory.build('user', { username: '' }) 
     .then(user => user.validate()) 
     .catch(error => expect(error.errors.messages.username).toMatch('is required')) 
     .then(done); 
    }); 
}); 

在這種情況下,如果創建成功,則回調catch不調用,我們done。所以基本上規格成功,而它應該失敗。 這只是一個普遍問題的例子:當我們把期望置於then/catch之內時,我們不能確定它們會被調用。

你會怎樣寫這個?

對於這個具體的例子我能想到這樣的解決方案的(但我不喜歡與承諾這種方式混合回調):

describe('User',() => { 
    it('requires username', done => { 
    factory.build('user', { username: '' }) 
     .then(user => user.validate(error => 
     expect(error.errors.messages.username).toMatch('is required'))) 
     .then(done); 
    }); 
}); 

回答

2

你會拋出一個錯誤的情況下,你不要指望:

return factory.build('user', { username: '' }) 
    .then(user => user.validate()) 
    .then(result => { throw new Error("expected rejection but got fulfilled promise"); }, 
     error => expect(error.errors.messages.username).toMatch('is required')) 

或者,也可以改變這兩種情況下爲在其上匹配的結果值,手動或通過使用承諾方法如reflect

.then(result => null, 
     error => error) 
    .then(val => expect(val.errors.messages.username).toMatch('is required')) 

如果您知道result從不是類似錯誤的對象,則可以省略第一個onFulfilled回調或僅使用catch

+0

我認爲這有點多餘,因爲我們沒有從'except'中受益。當測試失敗時,我們沒有看到像''預期的匹配空''是'''',但是是異常消息。反覆做這件事似乎很麻煩。 –

+0

「except」是什麼意思?如果你反覆這樣做,你可以簡單地定義一個你傳遞給'then'的助手函數,或者使用與斷言/測試庫一起提供的許多投擲器之一。 – Bergi

+0

啊我犯了一個錯字,我的意思是「期望」。 –