簡體   English   中英

測試Promise鏈中未公開的功能

[英]Testing unexposed functions in a Promise chain

我有UI組件,該組件調用方法getUserInfo() ,該方法返回承諾鏈。 當我第一次構建它時,我認為這是一個好主意,我編寫了許多未經測試的代碼。 getUserInfo()接受幾個輸入參數,並返回以下內容。 這是一長串的諾言的開始,最終解決了一個字符串數組。 現在我正在嘗試測試,但遇到了很多麻煩...

utilities.js

...
// 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模塊內,是唯一公開的功能。 在測試這個方面我有點迷茫。 getUserInfogetUserInfo功能的開始。 鏈接的大多數功能都進行外部API調用,其中一些包裝在promises中。 如果這些函數沒有進行外部API調用,則它們是在處理數據並創建新的數據集(換句話說,應該進行單元測試的函數)。 在這里進行存根和嘲笑似乎很合適,但是對於存根和嘲笑什么我感到困惑。 我應該模擬每個功能,並測試promise的最終結果嗎?

另外,由於getUserInfo是模塊中公開的唯一函數,因此此處進行單個單元測試似乎不可行。 不公開時如何測試所有中間函數(如getDistanceFromEachPlace)?

testfile.js

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是一個允許您執行此操作的模塊。

https://github.com/jhnns/rewire

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM