我曾經有過下面的代碼中承諾:測試承諾
function makeCall(userInfo) {
api.postUser(userInfo).then(response => {
utils.redirect(response.url);
})
// other logic
return somethingElse;
}
,我能夠寫一個測試,是這樣的:
const successPromise = Promise.resolve({ url: 'successUrl' })
beforeEach(function() {
sinon.stub(api.postUser).returns(successPromise);
}
afterEach(function() {
api.postUser.restore();
}
it "calls API properly and redirects" do
makeCall({});
expect(api.postUser).calledWith(userInfo).toBe(true);
successPromise.then(() => {
expect(utils.redirect.calledWith('successUrl')).toBe(true);
done();
}
emd
,一切都是綠色的。現在
,我不得不添加另一個承諾,使另外一個外部調用,這樣做的API postUser調用之前,所以我的代碼如下所示:
function makeCall(names) {
fetchUserData(names).then(userData => {
return api.postUser(userData).then(response => {
utils.redirect(response.url);
})
})
// other logic
return somethingElse;
}
其中fetchUseData是許多承諾,比如像鏈:
function fetchNames(names) {
// some name regions
return Promise.all(names);
}
function fetchUserData(names) {
fetchUsersByNames(names).then(users => {
// For now we just choose first user
{
id: users[0].id,
name: users[0].name,
}
});
}
而且我的測試失敗了。我正在嘗試瞭解如何更改我的測試,以確保我仍在測試是否正確執行了最終的API調用,並且重定向也已完成。我想存根fetchUserData(names)
,以防止做這個HTTP調用。
您沒有使用正確的承諾。你的代碼沒有一個'return'語句,它應該有幾個(或者至少應該使用箭頭函數,這樣你不需要它們,你不這樣做)。您不斷將自由浮動的代碼塊稱爲「我的代碼」。什麼是調用該代碼?你的測試不應該調用它嗎?在您的代碼已經運行到其他地方後,它們似乎正在觀察一些結果。 – JLRishe
嘗試返回內部承諾(添加'return')以創建承諾鏈。 – TiagoLr
@JLRishe更新。我主要關心的是我應該把「done()」放在哪裏,或者我應該做什麼,這樣承諾就會被扼殺和評估。 –