如何用Jest模拟咖喱功能?

zhe*_*lin 5 jestjs

add.js

export default a => b => a+b;
Run Code Online (Sandbox Code Playgroud)

module.js

import add from './add';

export default {
    add1: n => add(1)(n),
};
Run Code Online (Sandbox Code Playgroud)

测试 /module.js

import add from '../add';
import module from '../module';

jest.mock('../add', () => () => jest.fn());

module.add1(6);
expect(add.mock.calls).toHaveLength(1);
Run Code Online (Sandbox Code Playgroud)

可以调用此函数,但它add不是模拟函数,而是add()模拟函数,但是未正确记录调用参数。

jest.mock('../add', () => () => jest.fn(a => b => a+b));
Run Code Online (Sandbox Code Playgroud)

也尝试过这种方法,但似乎也无法正常工作。

jest.mock('../add', jest.fn(a => b => a+b));
Run Code Online (Sandbox Code Playgroud)

这会引发inline function错误

目前有没有模拟咖喱功能的正确方法?

And*_*rle 5

简单版本应该是这样的

jest.mock('../add', () => (a) => jest.fn(b => a+b));
Run Code Online (Sandbox Code Playgroud)

因此,您add使用一个函数来模拟模块,该函数返回当被调用时返回间谍,问题是您无法在间谍上测试任何内容。

所以我们需要重构它,这样你就可以add1在测试范围内像间谍一样思考

import add from '../add'
jest.mock('../add', () => jest.fn)

const addC = jest.fn()
add.mockImplemetation((a) => {
  addC.mockImplementation((b => a+b)
  return addC
})
Run Code Online (Sandbox Code Playgroud)