2017-08-17 189 views
0

我有一個不尋常的問題,我還沒有找到任何解決方案,我一直在嘗試相當一段時間。我創建了一個名爲delay的函數,它基本上創建了一個新的Promise,它在給定的時間量後自行解決。這個功能的目的是能夠延遲一系列承諾。它看起來有點像這樣:在Karma測試異步延遲功能

const delay = ms => new Promise((resolve, reject) => { 
    setTimeout(resolve, ms); 
}); 

let test = ''; 

const func =() => { 
    delay(1000).then(() => { 
     test = 'kek'; 
    }); 
}; 

describe('unit tests',() => { 
    it('test function func',() => { 
     // Act 
     func(); 
     // Assert 
     expect(test).toEqual('kek'); 
    }); 
}); 

問題是測試,我已經在這個例子中提供,因爲它只有在1000毫秒延時,變量測試設置爲KEK將失敗的單元測試。

我已經嘗試了通常的解決方案,比如在單元測試中有一個setTimeout,並且在聲明之前用jasmine.clock()。tick(1001)嘗試過,但是我無法讓它工作。

任何想法?

回答

0

我實際上建議這樣做(在lolex,定時器庫),現在我確信這是一件好事,因爲這個原因,這是不可能覆蓋調度器的。這是因爲它可以改變可能非常成問題的呼叫排序。

承諾總是異步解決,你必須讓你的測試異步和返回的承諾。

這裏是你如何編寫測試與異步功能:

describe('unit tests',() => { 
    it('test function func', async() => { 
     // Act 
     let promise = func(); // wait for it to be ready 
     clock.tick(1001); 
     await promise; // wait for the promise to complete. 
     // Assert 
     expect(test).toEqual('kek'); 
    }); 
}); 

這樣你就不會等待1000毫秒,但測試仍然可以工作。