[英]Testing unexposed functions in a Promise chain
我有UI組件,該組件調用方法getUserInfo()
,該方法返回承諾鏈。 當我第一次構建它時,我認為這是一個好主意,我編寫了許多未經測試的代碼。 getUserInfo()
接受幾個輸入參數,並返回以下內容。 這是一長串的諾言的開始,最終解決了一個字符串數組。 現在我正在嘗試測試,但遇到了很多麻煩...
...
// function geocodeLocation(zipcode){...};
// function getPlace(coordinates){...};
// ... etc
...
const utilities = {
getUserInfo: function (zipcode, gender) {
return geocodeLocation(zipcode)
.then(coordinates => getPlaces(coordinates))
.then(placeData => getDistanceFromEachPlace(origin, placeData))
.then(places => getMembersFromPlaces(places, gender))
.then(members => sortMembersByAge(members))
.then(sortedMembers => selectMembers(sortedMembers, gender))
}
};
module.exports = utilities;
getUserInfo
位於utilities
模塊內,是唯一公開的功能。 在測試這個方面我有點迷茫。 getUserInfo
是getUserInfo
功能的開始。 鏈接的大多數功能都進行外部API調用,其中一些包裝在promises中。 如果這些函數沒有進行外部API調用,則它們是在處理數據並創建新的數據集(換句話說,應該進行單元測試的函數)。 在這里進行存根和嘲笑似乎很合適,但是對於存根和嘲笑什么我感到困惑。 我應該模擬每個功能,並測試promise的最終結果嗎?
另外,由於getUserInfo
是模塊中公開的唯一函數,因此此處進行單個單元測試似乎不可行。 不公開時如何測試所有中間函數(如getDistanceFromEachPlace)?
import utilities from '../util/utilities'
import sinon from 'sinon'
import mocha from 'mocha'
describe('___api', () => {
it('should return a promise', () => {
const zipcode = '90210'
const gender = 'male'
// stub( other api functions here?? )
expect(utilities.getUserInfo(zipcode, gender).to.be.a('promise')
});
});
我現在可以測試一下嗎?
這是一個自以為是的答案,因此請您從中獲取幫助。
我回答的基礎是,如果您必須更改要測試的代碼以對其進行實際測試,那么您就不必實際測試所需的代碼。
我應該模擬每個功能,並測試promise的最終結果嗎?
我將重點放在模擬用來進行外部API調用的內容上。 也就是說,保持utilities.js
不變,並在測試代碼中使用sinon
嘲笑你已經使用,使外部API調用的庫/代碼。 (我無法真正給您一個示例,因為我不知道您在使用什么)
不公開時如何測試所有中間函數(如getDistanceFromEachPlace)?
我不會-單元測試應該通過代碼的界面進行測試。
說了這么多,如果您想研究更改模塊的內部結構,那么rewire
是一個允許您執行此操作的模塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.