2017-06-30 64 views
0

我最近不得不在工作中修復一箇舊的反應組件。通常在修復一個bug時,我們會用它來寫一個測試。問題是,響應組件會從服務器進行異步提取(我可以重構代碼,這樣異步操作就會移入到redux中,但我們不會在這裏進行重構,作爲bug修復的一部分),所以當測試組件是什麼時應該呈現,我不得不等待500ms允許承諾解決。一種更優雅的測試摩卡時間的方法

我知道如果我創建組件的一個實例並直接調用方法,我就不必做setTimeout,我可以做一個.then,但我們希望測試組件的輸入/輸出而不調用內部方法。

有沒有比設置超時更優雅的解決方案?這裏是當前的代碼:

it('autofills and locks all the fields where user data is present', function(done) { 
    const emailInput = $wrapper.find('#email'); 
    emailInput.value = '[email protected]'; 
    emailInput.simulate('blur'); 

    // - autofill does an async request 
    // - we need to wait for the promise to resolve before 
    // checking if the inputs are disabled or not 
    setTimeout(() => { 
     const identifierInput = $wrapper.find('#id'); 
     const lastNameInput = $wrapper.find('#last-name'); 
     const phoneNumberInput = $wrapper.find('#phone-number'); 
     const firstNameInput = $wrapper.find('#first-name'); 

     expect(firstNameInput.html().includes('disabled')).to.be.true; 
     expect(lastNameInput.html().includes('disabled')).to.be.true; 
     expect(phoneNumberInput.html().includes('disabled')).to.be.true; 
     expect(identifierInput.html().includes('disabled')).to.be.true; 
     done(); 
    }, 500); 
}); 

回答

0

「我們不重構作爲錯誤修復的一部分」......哇。

無論如何,如果您需要編寫測試來完成您的工作,您將需要模擬您的API調用。 500毫秒超時會在網絡有點慢或什麼時候失敗,這是一個非常非常脆弱的測試。

由於您沒有詳細說明請求是如何產生的,所以我不能告訴你其他任何東西,但是你會發現所有HTTP請求風格的模仿庫:fetch-mock for fetch,nock ...有噸。

這個想法是,你應該立即設置一個假的答案,並立即返回(如果需要,使用Promise.resolve())。