【发布时间】:2021-10-01 12:59:42
【问题描述】:
我是一名 JavaScript 开发新手,在进行单元测试时遇到了问题。 我正在使用 Jest。我使用 Node.js 13.14.0 运行测试(我使用旧版本,因为我有 Windows 7)。 我遇到了以下问题:我需要从我正在测试的函数所在的同一模块中模拟一个函数。简单地说,该函数从同一个模块调用另一个函数,我想确保它被调用。在谷歌上搜索后,我没有找到完整的解决方案。我喜欢使用 rewire 插件的选项,但这会破坏代码覆盖率。 我从模块中导出函数如下:
module.exports = {
functions...
}
然后我使用 require 将它们导入到测试文件中。
我看到遇到这个问题的人被告知了一些使用 ES6 模块的方法,但我一直无法弄清楚如何使它们工作,并且我没有迫切需要在我的项目中使用它们。那么,是否有任何成熟的解决方案?也许我应该使用不同的测试框架?而且我完全不明白为什么会存在这个问题。每个模块使用一个函数是一种常见的做法吗?
无论如何,我正在寻找一些简单的方法,比如使用 rewire:
const otherFuncMock = module.__set__(otherFunc, jest.fn())
module.func() // calls otherFunc()
expect(otherFuncMock).toHaveBeenCalledTimes(1)
【问题讨论】:
-
使用
Sinon库为 JS 创建存根、模拟和间谍。它易于使用且简单;你也会在那里得到很多例子......sinonjs.org -
但最好的解决方案是根本不这样做 - 同一模块内的内部调用是实现细节,而是测试行为。跨度>
-
换句话说,同一个模块中的函数就像同一个类中的方法;我已经说明了为什么你不应该在 stackoverflow.com/a/66752334/3001761 中嘲笑它。
标签: javascript unit-testing jestjs