Reactjs 如何使用Jest测试具有嵌套函数的Redux操作的高阶函数

Reactjs 如何使用Jest测试具有嵌套函数的Redux操作的高阶函数,reactjs,testing,redux,jestjs,higher-order-functions,Reactjs,Testing,Redux,Jestjs,Higher Order Functions,我正在使用Jest测试Redux操作函数fn1。fn1是封装fn2的高阶函数。我的测试只是确保在执行fn1时调用fn2。似乎不起作用。我正在考虑使用jest.spyOn,但似乎没有什么意义 myActions.js: myAction.test.js: import {fn1, fn2} from myAction.test.js it("should call fn2", () => { fn1({test:"test"})("David") expect(fn2).t

我正在使用Jest测试Redux操作函数fn1。fn1是封装fn2的高阶函数。我的测试只是确保在执行fn1时调用fn2。似乎不起作用。我正在考虑使用jest.spyOn,但似乎没有什么意义

myActions.js:

myAction.test.js:

import {fn1, fn2} from myAction.test.js

it("should call fn2", () => {
    fn1({test:"test"})("David")
    expect(fn2).toHaveBeenCalled();
  });

在某种程度上,我觉得您试图做的是测试实现细节,而不是函数的API,但在单元测试中,您确实希望测试或断言基于指定输入的正确输出,即
f(x)=y
,测试输入
x
产生输出
y

大概您的
fn2
将有自己的单元测试,因此您可以假设它在其他函数中使用时经过测试并正确无误,例如
fn1

下面是我将如何测试
fn1

it("should compute composed value", () => {
  expect(fn1({ test: "test" })("David")).toEqual({
    name: "David",
    obj: { test: "test" }
  });
});

我认为监视或断言函数调用的典型用例是回调。回调不是函数实现的一部分,但通常是外部副作用

const fn3 = (value, callback) => {
  // bunch of code logic
  callback(value);
  // more code logic
  return true;
};

it("should callback function", () => {
  const cb = jest.fn();
  fn3(3, cb);
  expect(cb).toHaveBeenCalledWith(3);
});
不是答案的一部分,但信息丰富

在这一点上,我想指出术语中的一个错误:高阶函数与Currying

是一种将函数作为输入并返回新函数的函数。示例包括
.map
.filter
,功能组合

const plus3=x=>x+3;//一阶函数
常数双=(fn,v)=>fn(v)*2;//高阶函数
常量plus3AndDouble=x=>double(plus3,x);//(修饰的)一阶函数
console.log(plus3AndDouble(0));//(0 + 3) * 2 = 6
console.log(plus3AndDouble(1));//(1+3)*2=8
const fn3 = (value, callback) => {
  // bunch of code logic
  callback(value);
  // more code logic
  return true;
};

it("should callback function", () => {
  const cb = jest.fn();
  fn3(3, cb);
  expect(cb).toHaveBeenCalledWith(3);
});