4

這裏我有一個函數generateBlocks,它需要一個數組blocks和函數onBlockClick。它返回一個對象數組,其中每個對象都有兩個屬性labelonClick如何測試返回函數的函數?

function generateBlocks(blocks, onBlockClick){ 
    return blocks.map(block => (
    { 
     label: block.label, 
     onClick:()=>onBlockClick(block.name) 
    } 
)) 
} 

我無法測試它的返回值。 這裏的測試用例:

const blocks = [{label: "A", name: "a"}, {label: "B", name: "b"}]; 
const onBlockClick = someFunction(){}; 

expect(generateBlocks(blocks, onBlockClick)).to.deep.equal(expected) 

我無法創建expected[[{label: "A", onClick:()=>onBlockClick("A")},...],因爲函數的引用也會有所不同。

那麼我該如何重構generateBlocks函數才能使其可測試?

+0

您採取的第一步是詢問**「我如何測試它?」**。接下來你應該問自己的問題是**「我想在這裏測試什麼?」**。如果你實際上不知道你想測試什麼,那麼很難重構現有代碼來使其可測試。 – byxor

+4

那麼,不要使用'deep.equal'?只要聲明每個對象都有一個'.label',並且在傳入'onBlockClick'的標識函數時,它的'.onclick()'返回名稱。 – Bergi

+0

@Brandon請參閱**清楚說明的測試用例**我想要測試的是**返回值**。 –

回答

0

您可以在函數ref上使用.toString()方法,並與預期的字符串結果進行比較。