2016-04-26 17 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. 'spy'と' fakeClient'を 'before'ブロックに設定する必要はありませんか?注意: 'done'コールバックを使わずにテストで約束を返すことができます(mochaは' 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}) 
)) 
}) 
関連する問題