【问题标题】:JavaScript unit testing: Mocking other function from same module [duplicate]JavaScript单元测试:模拟来自同一模块的其他功能[重复]
【发布时间】: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


【解决方案1】:

如果 otherFunc 由模块导出,则只需使用 jest.fn() 模拟它应该可以工作

const otherFuncMock = just.fn(x => module.otherFunc);
module.func();
expect(otherFuncMock).toHaveBeenCalledTimes(1);

如果它没有被导出,那么我建议你不需要这个测试。它调用另一个函数的事实是一个内部实现问题,您最好专注于测试组合函数执行的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2018-07-17
    • 2015-11-09
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多