【发布时间】:2016-12-26 12:32:36
【问题描述】:
这里我有一个函数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)
我无法将expected 创建为[[{label: "A", onClick: ()=>onBlockClick("A")},...],因为函数引用会不同。
那么如何重构 generateBlocks 函数以使其可测试?
【问题讨论】:
-
您采取的第一步是询问“我该如何测试它?”。您应该问自己的下一件事是“我想在这里测试什么?”。如果您实际上不知道要测试什么,则很难重构现有代码以使其可测试。
-
好吧,不要使用
deep.equal?只要断言每个对象都有一个.label,并且当您传入onBlockClick的标识函数时,它的.onclick()返回名称。 -
@Brandon 请查看清楚地解释我要测试的是返回值的测试用例。
-
@Bergi 我没听懂你的意思,返回名字是什么意思? onBlockClick 不返回任何内容。
-
@ArjunU.:但如果是这样,
onClick也会如此,您可以轻松测试该返回值。或者您使用 sinon 之类的库来监视调用。
标签: javascript function unit-testing purely-functional pure-function