【问题标题】:Jest: global setup async with access to jest for mocking purposesJest:全局设置异步访问 jest 以进行模拟
【发布时间】:2018-09-12 14:41:58
【问题描述】:

场景 运行 Jest 对运行 mongodb 内存实例的 nodejs API 进行单元测试(通过 mongodb-memory-server

我的目标 对于所有测试文件,内存数据库应该只启动一次。

为什么 虽然启动 1 个数据库 PER FILE 甚至不是什么大问题(只要运行速度快),最重要的原因是插件首先通过大量下载获取 mongo 二进制文件(如果它们尚未在缓存中)。因此,只执行一次此操作而不是 ONCE PER FILE 是有意义的,因为下载以完全相同的方式进行(它从 Web 获取文件并将它们放入文件夹中)。

问题 除了启动内存中的 mongo 之外,我还需要模拟我的 dbService.js 文件,以便依赖于它的每个文件都将使用模拟版本(以及内存服务器)。所以我不能真正使用 Jest 的globalSetup 选项,因为在那个文件中jestundefined。我什至不能使用setupFiles,因为它们运行每个文件并且它们是同步的,而由于 mongodb connect 的性质,我需要一个异步函数。我还尝试在每个传递公共实用程序模块的文件中使用beforeAll,但由于测试文件并行运行,即使实用程序模块每个文件运行一次。

还有 我想避免拥有 1 个唯一的测试文件。我知道这是一种解决方法,但我想知道是否有一个简单而干净的解决方案。完美的场景是“先做一些异步的事情,然后并行地做测试”。不应该那么难吗?

【问题讨论】:

    标签: node.js mongodb unit-testing jestjs in-memory-database


    【解决方案1】:

    我要做的是在globalSetup 中下载文件,然后在__mocks__ 目录或setupFiles 中设置您的db 和mock mock,以避免在每次测试中都显式设置它。

    __mocks__ 目录更可取,因为模拟仅在您的代码最终需要该文件而不是在每个测试中运行时运行。

    【讨论】:

    • 我做了类似的事情,我在 npm install 下载二进制文件,然后为每个文件启动多个数据库实例。但由于最后与数据库对话的文件只有 1 个,所以我只启动了 1 个 mongo 内存。
    猜你喜欢
    • 2019-01-23
    • 2019-11-22
    • 2017-03-19
    • 2018-07-08
    • 2016-05-20
    • 2021-08-11
    • 2021-08-11
    • 2018-08-08
    • 1970-01-01
    相关资源
    最近更新 更多