【问题标题】:Jest - how to check if a function is called by another functionJest - 如何检查一个函数是否被另一个函数调用
【发布时间】:2020-06-25 20:29:54
【问题描述】:

我正在使用 Jest 来测试一些 Javascript。在一个名为“function.js”的文件中,我有两个这样的函数:

functions.js

const firstFunc = () => {
  const x = secondFunc()
  return x
}

const secondFunc = () => {
  return '5'
}

module.exports = {
  firstFunc,
  secondFunc
}

在我的 Jest 测试文件中,我有:

const functions = require('./functions.js')

test('test if secondFunc is called', () => {
  const mockFunction = jest.fn()
  functions.secondFunc = mockFunction;
  functions.firstFunc()
  expect(mockFunction).toHaveBeenCalled()
})

我实际上已经尝试过很多不同的变化。我无法让 jest.fn() 正常工作。总的来说,我希望能够看到有关 secondFunc 的信息,例如它被调用了多少次、使用了哪些参数等,但我必须实际调用 firstFunc。任何人都可以帮助我,因为我似乎无法弄清楚这一点。

【问题讨论】:

  • 这段代码在编写时无法测试。当您执行functions.secondFunc = ... 时,您只是覆盖了您的模块导出的内容。不是实际的secondFunc 函数,在firstFunc 中有引用(它是const,这使得它更明显不是您实际覆盖的内容)。可以找到一些有趣的解决方法here
  • 我觉得你测试firstFunc的方式打破了单元测试的规则,单元测试应该只关心给定输入的预期输出。
  • @MarkoCen 这个例子很简单,但有时,你的函数调用另一个函数是单元测试的关键。例如,您可能想要检查您的函数是否正在使用正确的参数向某个 API 发出 POST 请求。在这种情况下,您将模拟请求库(例如axios)以使请求不会发生,但您想检查是否为其提供了正确的参数(并且您不测试是否axios实际上提出了这个请求,因为它有自己的测试)

标签: javascript node.js unit-testing jestjs


【解决方案1】:

您需要进行一些重构。为secondFunc 保留相同的引用。 然后你可以用一个模拟对象替换它。

functions.js:

const firstFunc = () => {
  const x = exports.secondFunc();
  return x;
};

const secondFunc = () => {
  return '5';
};

exports.firstFunc = firstFunc;
exports.secondFunc = secondFunc;

单元测试结果:

 PASS  stackoverflow/62583841/functions.test.js (12.17s)
  ✓ test if secondFunc is called (3ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        13.779s

【讨论】:

  • 能否将单元也包含在测试本身中?
  • @AKD 和你的一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 2021-10-05
  • 2021-12-15
相关资源
最近更新 更多