Jest - 如何检测一个函数是否被另一个函数调用

3

我将使用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。有人能帮助我吗?因为我似乎无法解决这个问题。


1
这段代码无法进行测试,因为它是这样编写的。当你执行 functions.secondFunc = ... 时,你只是覆盖了你的模块导出内容。而不是实际的 secondFunc 函数,在 firstFunc 中有一个对它的引用(它是一个 const,这使得它更明显不是你实际覆盖的内容)。一些有趣的解决方法可以在这里找到。 - blex
我认为你测试firstFunc的方式违反了单元测试的规则,单元测试应该只关心给定输入的预期输出。 - MarkoCen
@MarkoCen 这个例子很简单,但有时候你的函数调用另一个函数是单元测试中的关键。例如,你可能想要检查你的函数是否使用正确的参数向某个 API 发送了 POST 请求。在这种情况下,你需要模拟请求库(例如 axios),以便请求不会真正发生,但你想要检查是否向它传递了正确的参数(你不需要测试 axios 是否实际发出了该请求,因为它有自己的测试)。 - blex
1个回答

2

你需要进行一些重构。保持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
1
@AKD 和你的一样。 - Lin Du

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接