Javascript 如何测试返回函数的函数?

Javascript 如何测试返回函数的函数?,javascript,function,unit-testing,purely-functional,pure-function,Javascript,Function,Unit Testing,Purely Functional,Pure Function,这里我有一个函数generateBlocks,它接受一个数组blocks,还有一个函数onBlockClick。它返回一个对象数组,其中每个对象有两个属性label和onClick function generateBlocks(blocks, onBlockClick){ return blocks.map(block => ( { label: block.label, onClick: ()=>onBlockClick(block

这里我有一个函数
generateBlocks
,它接受一个数组
blocks
,还有一个函数
onBlockClick
。它返回一个对象数组,其中每个对象有两个属性
label
onClick

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)
我无法将
预期的
创建为
[[{label:“A”,onClick:()=>onBlockClick(“A”)},…]
,因为函数引用将不同


那么,如何重构generateBlocks函数以使其可测试?

您可以对函数ref使用.toString()方法,并与预期的字符串结果进行比较。

您采取的第一步是询问“我如何测试它?”。接下来您应该问自己“我想在这里测试什么?”。如果您实际上不知道要测试什么,则很难重构现有代码以使其可测试。好吧,不要使用
deep.equal
?只要断言每个对象都有一个
.label
及其
.onclick()
onBlockClick
传递标识函数时返回名称@Brandon请查看测试用例,该测试用例清楚地解释了我要测试的内容,即返回值。@Bergi我不明白您的意思,返回名称是什么?onBlockClick不返回任何内容。@ArjunU.:如果是,则
onClick
将作为嗯,你可以很容易地测试返回值。或者你可以使用像sinon这样的库来监视调用。