javascript - 判断函数是否接受参数

标签 javascript jestjs

我写错了 Jest 测试的代码。

test('init data', (done) => {
  expect(services.getList).toHaveBeenCalled();
  // accept done as param, but not called
});

我得到了预期的错误:

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

但是如果我删除 done 参数,则 passed:

test('init data', () => {
  expect(services.getList).toHaveBeenCalled();
});

jest 如何知道 我接受了done 参数?太神奇了!

最佳答案

How does jest know that I accepted the done parameter?

通过这两个代码示例,它可以通过两种方式获知:

  1. 通过查看回调的 length 属性,在第一种情况下为 1,在第二种情况下为 0。函数的长度 是它的arity(它声明的形式参数的数量¹)。
  2. 通过使用Function#toString 并解析它提供的代码。在一般情况下,这不是您想要在生产代码中执行的操作,但对于测试工具来说绝对没问题。

例子:

function test(label, callback) {
  console.log(`${label}: length: ${callback.length}`);
  console.log(`${label}: toString(): ${callback.toString()}`);
}
test('init data', (done) => {
  // ...
});

test('init data', () => {
  // ...
});


¹ 在 JavaScript 中,它是它声明的形式参数的数量,不包括剩余参数(如果有)或从具有默认值的第一个参数开始的任何参数。

关于javascript - 判断函数是否接受参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51188599/

相关文章:

javascript - 如何测试在 componentDidMount 中异步调用创建的组件?

javascript - 无法在条件检查时设置 .css() 方法

javascript - 在 HTML SELECT 标签中禁用键盘

javascript - AngularJS 指令限制

javascript - 如何测试 useState 钩子(Hook)是否已使用 jest 和 React 测试库调用?

javascript - Promise 在 Jest 测试中没有正确拒绝

javascript - 如何使用 javascript 将 LatlngBounds 对象传递给 nodejs 服务器

javascript - JQuery - 焦点在目标输入中触发 keyup 事件

reactjs - 如何测试函数是否在功能性 React 组件中调用 onChange?

javascript - 如何模拟在我正在测试的函数内部调用的函数?