使用 Jest 进行模拟函数概述
高阶函数接受一个函数并返回一个函数。Jest提供了一种方法来确保您给出的函数被正确使用。
测试高阶函数
假设你想写一个记忆函数。它可能看起来像这样:
// memoize.js
export default function memoize(func) {
return function (key) {
const registry = new Map();
let value = registry.get(key);
if (typeof value === 'undefined') {
value = func(key);
registry.set(key, value);
}
return value;
}
}
为了测试它,你会得到类似的东西:
import memoize from './memoize';
it('memoizes `func`.', () => {
// `func` here just cubes the input.
const func = value => Math.pow(value, 3);
const memoizedFunc = memoize(func);
expect(memoizedFunc(3)).toEqual(27);
expect(memoizedFunc(4)).toEqual(64);
expect(memoizedFunc(3)).toEqual(27);
expect(memoizedFunc(5)).toEqual(125);
});
yarn run test
,一切都过去了,我们就完成了,对吧?
测试高阶函数的麻烦
但是 有一个问题memoize
。你发现了吗?问题是你测试的是结果函数,而不是输入函数的使用方式。为此,Jest 提供了模拟函数。
创建模拟函数
这很简单;只需传递一个实现函数,jest.fn
它就会给你一个模拟函数。
嘿,这也是一个高阶函数!
让我们使用它来进行memoize
更好的测试:
import memoize from './memoize';
it('memoizes `func`.', () => {
// A mock function: a function wrapped in `jest.fn`.
const func = jest.fn(value => Math.pow(value, 3));
const memoizedFunc = memoize(func);
expect(memoizedFunc(3)).toEqual(27);
expect(memoizedFunc(4)).toEqual(64);
expect(memoizedFunc(3)).toEqual(27);
expect(memoizedFunc(5)).toEqual(125);
// Mock functions have a few special matchers available to them. Let's take a look.
// `func` was called.
expect(func).toHaveBeenCalled();
// `func` has been called with 5.
expect(func).toHaveBeenCalledWith(4);
// `func` was last called with 5.
expect(func).toHaveBeenLastCalledWith(5);
// `func` was called thrice (since the second 3 was supposed to be memoized).
// Supposed to.
expect(func).toHaveBeenCalledTimes(3);
});
现在您正在测试如何使用该函数,您可以在中捕获该错误memoize
。