【问题标题】:import inside Jest manual mock (in __mocks__) is sometimes undefined在 Jest 手动模拟中导入(在 __mocks__ 中)有时未定义
【发布时间】:2019-08-10 16:10:18
【问题描述】:

我想在我的 Jest 模拟中使用 Firebase Firestore 模拟器进行集成测试。我的src/__mocks__/firebase.ts 是:

import mockFirebase from '@firebase/testing'

console.log(mockFirebase)

export const firebase = mockFirebase.initializeAdminApp({
  projectId: `autoflocc-${process.pid}`,
})

export const db = firebase.firestore()

在测试代码中导入如下:

import mockFirebase from '@firebase/testing'
jest.mock('../src/firebase')

但是,当模拟文件运行时mockFirebaseundefined(根据console.log)。我试过导入其他模块和一些工作(import _ from 'lodash'),但其他人没有(import x from 'firebase-functions'),也返回undefined

知道为什么某些导入在手动模拟中有效,而在其他模拟中无效?

注意:这是 Typescript,可能会影响它。

【问题讨论】:

  • 如果您的应用程序中有循环导入,可能会导致 Jest 模拟导入为未定义。 Jest.mock 会将代码提升到文件的顶部,如果你有循环导入,jest 会变得非常混乱。确保将代码充分分离以避免任何循环导入。

标签: typescript firebase jestjs integration-testing


【解决方案1】:

这个语法:

import mockFirebase from '@firebase/testing';

...正在尝试将@firebase/testingdefault export 导入为mockFirebase...

...但是mockFirebase 最终是undefined 因为@firebase/testing doesn't have a default export


@firebase/testing 中导入所有内容的正确语法是:

import * as mockFirebase from '@firebase/testing';

【讨论】:

  • 谢谢。但我仍然得到相同的结果:import * as mockFirebase from '@firebase/testing'; mockFirebase.initializeAdminApp({...}) 导致:TypeError: mockFirebase.initializeAdminApp is not a function 因为initializeAdminApp 未定义。
  • 此外,当我控制台注销 mockFirebase(从 * 导入时)然后 databasefirestore 未定义但 apps 和其他所有内容都已定义。就像那个模块在我导入它时只是部分初始化了一样。
  • 我可以解决这个问题,但是在函数内部(不在模块的顶层)调用 mockFirebase.initializeAdminApp(...) 现在会因 TypeError: firebase.initializeApp is not a function 而死。 firebase.initializeApp(...)@firebase/testing 包中的代码,不是我的。所以即使是 @firebase/testing 导入的模块也是未定义的。
猜你喜欢
  • 2018-06-30
  • 1970-01-01
  • 2017-05-23
  • 2020-02-26
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
相关资源
最近更新 更多