【问题标题】:How to test a function that returns functions?如何测试返回函数的函数?
【发布时间】:2016-12-26 12:32:36
【问题描述】:

这里我有一个函数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 函数以使其可测试?

【问题讨论】:

  • 您采取的第一步是询问“我该如何测试它?”。您应该问自己的下一件事是“我想在这里测试什么?”。如果您实际上不知道要测试什么,则很难重构现有代码以使其可测试。
  • 好吧,不要使用deep.equal?只要断言每个对象都有一个.label,并且当您传入onBlockClick 的标识函数时,它的.onclick() 返回名称。
  • @Brandon 请查看清楚地解释我要测试的是返回值的测试用例。
  • @Bergi 我没听懂你的意思,返回名字是什么意思? onBlockClick 不返回任何内容。
  • @ArjunU.:但如果是这样,onClick 也会如此,您可以轻松测试该返回值。或者您使用 sinon 之类的库来监视调用。

标签: javascript function unit-testing purely-functional pure-function


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-11
    • 2018-07-27
    • 2021-09-03
    • 2020-06-05
    • 2021-06-25
    • 2019-12-14
    • 2015-07-25
    • 2017-02-04
    相关资源
    最近更新 更多