2017-07-14 28 views
0

下面我有一段代碼來演示我如何測試/保留一個承諾,useSpyPromise下面的函數使用參數承諾spyPromise。我試圖弄清楚如何指定存根以在第一次調用(Promise.resolve(['hasLength'])時返回一個承諾,並在第二次調用(Promise.resolve([])上解決不同的承諾。sinon.stub()。返回指定爲每個電話,而不是一次

let spyPromise = sinon.stub().returns(Promise.resolve(['hasLength'])) 

function useSpyPromise (spyPromise) { 
    let promiseOne = spyPromise 
    .then(d => { 
     if (d.length === 0) throw new Error('d 0') 
     return d 
    }) 

    let promiseTwo = spyPromise 
    .then(d => { 
     if (d.length === 1) throw new Error('d 1') 
     return d 
    }) 

    return {promiseOne, promiseTwo} 
} 

回答

0

很難確切地告訴你想要什麼,但有一件事似乎很確定;提供的測試是同步的 - 即。沒有進一步的承諾 - 然後你不需要promise1promise2,只需return spyPromise.then(...)

你可能只是想完全由d.length確定的行爲,在這種情況下,它是那樣簡單:

function useSpyPromise(spyPromise) { 
    return spyPromise.then(d => { 
     if(d.length <= 1) { 
      throw new Error('d ' + d.length); 
     } 
     return d; 
    }); 
} 

但是,如果你真的想要的時間函數被調用必須考慮到的數帳戶,那麼也許是這樣的:

var count = 0; 
function useSpyPromise(spyPromise) { 
    count += 1; 
    return spyPromise.then(d => { 
     if(count === 0 && d.length === 0) { 
      throw new Error('d 0'); 
     if(count === 1 && d.length === 1) { 
      throw new Error('d ' + d.length); 
     } 
     return d; 
    }); 
} 

這是希望有一個非常奇怪的事情,但也許這是你的應用程序需要什麼。我不知道。

無論哪種方式,這不是故事的結束。您可以通過多種方式制定測試。例如應該count > 1條件拋出?這個問題並沒有這麼說,但你有沒有考慮過這些情況?

你寫什麼取決於你想要的確切行爲。

相關問題