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这样的库来监视调用。