【问题标题】:How to mock a 3rd party module that is just a function ('js-file-download')如何模拟只是一个函数的第 3 方模块('js-file-download')
【发布时间】:2022-03-16 22:34:03
【问题描述】:

我正在尝试围绕使用“js-file-download”的 React 组件中的下载功能编写测试。在我的测试中,我已经能够以几种方式模拟它:

import fileDownload from 'js-file-download'

jest.mock('js-file-download', () => jest.fn(console.trace))
// or
jest.mock('js-file-download', () => {
  return {
    __esModule: true,
    default: jest.fn(console.trace)
  }
})

两者似乎都有效,因为它打印了一个看起来正确的跟踪。然而:

expect(fileDownload).toHaveBeenCalled()

失败:

Expected number of calls: >= 1
Received number of calls:    0

任何人都知道为什么它似乎调用了模拟,但没有注册它被调用?有没有另一种方法来解决这个问题?提前致谢!

【问题讨论】:

  • 你执行fileDownload函数了吗?
  • 是的,它被导入并发生在被测代码中,并且跟踪表明它正在正确发生。此外,如果我在测试中转储fileDownload,我检查它是否被称为它是一个模拟对象。但这就像我有两个模拟实例,一个在正在测试的代码中,另一个在测试用例中……这可能吗?但是,如果我尝试做类似的事情。 const mockFileDownload = jest.fn(); jest.mock('js-file-download', () => mockFileDownload)我得到ReferenceError: Cannot access 'mockFileDownload' before initialization
  • 我尝试添加jest.spyOn(fileDownload, 'default'),但仍然没有注册呼叫。
  • 我认为这是一个时间问题。我在代码调用点和测试验证点添加了一些日志记录,验证首先发生,另外我可以在调用点看到 .mock.calls。 'waitFor' 可能会解决问题,但不幸的是,另一个 3rd 方库遇到了麻烦。
  • 你能在哪里解决这个问题?我面临同样的问题。 :(

标签: javascript jestjs mocking es6-modules


【解决方案1】:

这就是我修复ReferenceError: Cannot access 'mockFileDownload' before initialization的方法

const mockFileDownload = jest.fn();
jest.mock('js-file-download', () => ({
    __esModule: true,
    default: () => mockFileDownload()
}));

要使断言生效,我们必须使用waitFor()

....
await waitFor(() => {
    expect(mockFileDownload).toHaveBeenCalledTimes(1);
});
...

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

我相信我一直正确地嘲笑它。真正的问题是时机以及阻止我使用“等待等待”的原因,因为这是关键。

import mockFileDownload from 'js-file-download'

jest.mock('js-file-download', () => ({
  __esModule: true,
  default: jest.fn()
}))

...

await waitFor(() => expect(mockFileDownload).toBeCalled())

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2021-06-27
    • 2014-05-31
    • 2018-02-19
    • 2021-04-19
    相关资源
    最近更新 更多