4

Hier habe ich eine Funktion generateBlocks, die in einem Array und eine Funktion onBlockClick übernimmt. Sie gibt ein Array von Objekten zurück, wobei jedes Objekt zwei Eigenschaften hat: label und onClick.Wie testet man eine Funktion, die Funktionen zurückgibt?

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

Ich kann nicht testen, es ist Rückgabewert. Hier ist der Testfall:

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

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

ich nicht expected als [[{label: "A", onClick:()=>onBlockClick("A")},...] erstellen kann, weil Funktionsreferenz anders sein wird.

Also, wie Refactor generateBlocks Funktion, um es testbar zu machen?

+0

Der erste Schritt, den Sie gemacht haben, ist zu fragen ** "Wie teste ich es?" **. Das nächste, was Sie sich fragen sollten, ist ** "Was will ich hier testen?" **. Es ist schwierig, vorhandenen Code umzuwandeln, um ihn testbar zu machen, wenn Sie nicht wirklich wissen, was Sie testen möchten. – byxor

+4

Nun, verwenden Sie nicht 'deep.equal'? Stellen Sie einfach sicher, dass jedes Objekt ein '.label' hat und dass' .onclick() 'den Namen zurückgibt, wenn Sie die Identity-Funktion für' onBlockClick' übergeben. – Bergi

+0

@Brandon Bitte sehen Sie sich den Testfall an, der ** deutlich erklärt ** was ich testen möchte, was ** der Rückgabewert ** ist. –

Antwort

0

Sie können die .toString() - Methode für die Funktion ref verwenden und mit dem erwarteten String-Ergebnis vergleichen.

Verwandte Themen