我正在尝试为一个 * debounce * 函数编写一个单元测试。我很难思考这个问题。
这是密码:
function debouncer(func, wait, immediate) {
let timeout;
return (...args) => {
clearTimeout(timeout);
timeout = setTimeout(() => {
timeout = null;
if (!immediate)
func.apply(this, args);
}, wait);
if (immediate && !timeout)
func.apply(this, args);
};
}
我该怎么开始?
8条答案
按热度按时间xdyibdwo1#
实际上,你不需要使用Sinon来测试去抖动,Jest可以在JavaScript代码中模拟所有的计时器。
看看下面的代码(它是TypeScript,但你可以很容易地把它翻译成JavaScript):
更多信息:* 一个月一次 *
pdkcd3nj2#
如果在代码中这样做:
如果你想测试函数
myFunc
或者调用它的函数,那么在测试中你可以使用jest
模拟debounce
的实现,让它只返回你的函数:来源:https://gist.github.com/apieceofbart/d28690d52c46848c39d904ce8968bb27
7kjnsjlb3#
您可能需要检查debouncer函数中的逻辑:
timeout
将始终由最后一条if()
语句设置this
将总是undefined
,因为箭头函数使用“封闭词法上下文的this
值”,并且debouncer()
被设计成用作独立函数。话虽如此,听起来你真实的的问题是关于测试去抖函数。
测试去抖功能
您可以通过使用模拟跟踪函数调用和伪计时器模拟时间的流逝来测试函数是否去抖。
下面是一个简单的示例,使用
debounce()
从Lodash
去抖函数的Jest
Mock Function和Sinon
fake timers:ugmeyewa4#
我喜欢这个类似的版本更容易有失败:
cmssoen25#
使用现代的假计时器(Jest 27已经默认了),你可以更简洁地测试它:
你可以把它实现为一个状态钩子,像这样去抖......
并测试为
源代码可从https://github.com/trajano/react-hooks-tests/tree/master/src/useDebouncedState获得
wpx232ag6#
以下是我的3项基本测试:
测试“去抖”逻辑有一些基本原理。
请注意,所有测试都是 async,因为测试的本质本身就是异步的。
这些测试由我编写,并非取自lodash debounce tests source code
vatpfxk57#
另一种方法是刷新去抖函数,使其立即执行:
axzmvihb8#
花了很多时间来弄清楚...终于成功了...。