2016-04-26 59 views
0

我有一個Axios XHR庫的包裝,我試圖爲我的代碼編寫一些單元測試。但是,當我運行我的測試時,他們都沒有告訴我超時超時。我如何構建我的測試以運行我的斷言?單元測試嵌套承諾失敗,超時

這裏的包裝代碼:

export const clientRequest = (xhrClient, endpoint, params = {}) => { 
    const method = params.method || 'get' 
    const {config, data, noOrg, unrestricted} = params 

    let reqParams = data 
    if (!isNil(data) && method === 'get') { 
    reqParams = {params: data} 
    } 

    const authConfig = unrestricted ? {...config, withCredentials: false} : 
    {...config, withCredentials: true} 

    const concatEndpoint = noOrg ? endpoint : 
    `${Cookies.get('organization') || 'default' }${endpoint}` 

    return new Promise((resolve, reject) => { 
    xhrClient[method](concatEndpoint, reqParams, authConfig) 
     .then(response => resolve(response)) 
     .catch(err => reject(err)) 
    }) 
} 

,問題中的測試:

describe('clientRequest()',() => { 
    const resolveSpy = sinon.spy() 
    const fakeClient = { 
     get:() => new Promise(resolveSpy), 
    } 

    it.only('should make a call to the supplied method', (done) => { 
     const result = xhr.clientRequest(fakeClient, '/foobar', {method: 'get'}) 
     result.then(() => { 
     expect(resolveSpy).to.have.beenCalledWith('/foobar', undefined, {withCredentials: true}) 
     done() 
     }) 
    }) 
    }) 
+0

我不認爲我可以回答你的問題。然而,我對你使用承諾有一個評論......你的'clientRequest'函數以一個返回值結束,這個返回值是一個新的承諾,它包含一個'then'的反應。這似乎違背了我對承諾的瞭解,因爲嵌套承諾通常(總是?)是一種反模式,應該進行扁平化。這可能與您的直接問題相關,也可能不相關,我可能會錯過代碼的重點,但您可能需要進一步研究。 –

+0

有幾個問題和一個註釋:1.是調用'then'內容的結果保證嗎? 2.你確定你不需要在'before'塊中設置'spy'和'fakeClient'嗎?注意:您可以在不使用'done'回調的情況下返回測試中的承諾(摩卡理解'Promises'並等待返回的完成) – MarcoL

+0

@MarcoL刪除'done'回調似乎已經奏效。我想知道爲什麼會導致它失敗? –

回答

0

似乎fakeClient.get是永遠不會解決。

因爲這是一個應該在可竊取的方法,我建議改變fakeClient這樣:

const fakeClient = { 
    get:() => Promise.resolve() 
} 
sinon.spy(fakeClient, 'get'); 

同樣重要的,以便處理在承諾鏈條錯誤添加catch電話:

result.then(() => { 
    expect(resolveSpy).to.have.beenCalledWith('/foobar', undefined, {withCredentials: true}) 
    done() 
}).catch(done); 
+0

順便說一下,'.then(response => resolve(response))'可以很容易地用'.then(resolve)'代替。 –

+0

感謝您的提示!不幸的是,解決方案沒有奏效,它仍然超時。 –

+0

@KevinWhitaker我已經更新了答案 - 這可能是缺少的'catch'。 –

0

我結束了@ MarcoL的建議,並返回了期望。

it('should make a call to the supplied method',() => { 
    const result = xhr.clientRequest(fakeClient, '/foobar', {method: 'get'}) 
    return result.then(() => (
    expect(resolveSpy).to.have.been.calledWith('/foobar', undefined, {withCredentials: true}) 
)) 
})