【发布时间】: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