【问题标题】:TypeError: firebase.initializeApp is not a function only when jest runs testsTypeError: firebase.initializeApp 不是仅在 jest 运行测试时的函数
【发布时间】:2018-11-19 17:59:39
【问题描述】:

在我的节点 js 项目中,我有一个 firebase.js 文件,它连接到实时数据库并导出一些与我的用户数据有关的函数。

firebase.js

'use strict'

const firebase = require('firebase')

const config = {
    apiKey: 'xxx',
    authDomain: 'xxx',
    databaseURL: 'xxx',
    projectId: 'xxx',
    storageBucket: 'xxx',
    messagingSenderId: 'xxx'
} 

firebase.initializeApp(config)

const db = firebase.database()

module.exports.getUserByUid = async user => {
    const usersRef = db.ref(`users/${user.uid}`)
    const snapshot = await usersRef.once('value')

    let userToReturn

    if(snapshot.exists()) {
        userToReturn = snapshot.val()
        userToReturn.uid = snapshot.key
    } else {
        throw Error('user not found')
    }

    return userToReturn
}

我从 userProcessor.js 文件中调用它

userProcessor.js

const db = require('../database/firebase')

module.exports.getUserByUid = async request => {
    const user = await this.extractUserData(request)
    const userToReturn = await db.getUserByUid(user) //here
    return userToReturn
}
..
module.exports.extractUserData = request => ({
    uid: request.body.uid,
    username: request.body.username,
    email: request.body.email})

如果我直接从文件中调用它,它会起作用。

我正在使用 koa 将其公开给 web api 上的 GET 请求,它工作正常(使用 Postman 测试)。

但是当我尝试对其进行小丑测试时,它会抛出:

TypeError: firebase.initializeApp is not a function

      15 | }
      16 | 
    > 17 | firebase.initializeApp(config)
         |          ^

userProcessor.test.js

const userProcessor = require('../modules/processors/userProcessor')

test('retrieve user that does not exist', async done => {
        try {
            await userProcessor.getUserByUid({body: {uid: '99xa999axa9x9x'}})
        } catch(err) {
            expect(err.message).toBe('user not found')
            done()
        }
    })

package.json

"devDependencies": {
    "eslint": "^5.9.0",
    "eslint-config-google": "^0.11.0",
    "firebase": "^5.5.8",
    "jest": "^23.6.0"
  },
  "dependencies": {
    "firebase-admin": "^6.1.0",
    "http-status-codes": "^1.3.0",
    "koa": "^2.6.2",
    "koa-bodyparser": "^4.2.1",
    "koa-cors": "0.0.16",
    "koa-router": "^7.4.0",
    "supertest": "^3.3.0"
  }

【问题讨论】:

  • 您不需要使用firebase-functions-test来启用远程测试吗?
  • 我之前尝试过非常相似(如果不相同)的代码并且它有效,所有测试都在数据库上进行,但我改变了一些东西(我认为)并且它抛出了那个错误。我必须使用 jest,因为这是一项要求,但您是否认为 firebase 可能会阻止我的请求,因为我不使用 firebase-functions-test? @RandyCasburn

标签: javascript node.js firebase jestjs


【解决方案1】:

问题是我在与firebase.js 相同的文件夹中有一个名为__mocks__ 的文件夹,其中包含另一个名为firebase.js 的文件。

解决方案正在改变

const firebase = require('firebase')

const firebase = require('../../node_modules/firebase')

【讨论】:

  • 别人怎么会知道你保存了一个与模块同名的本地文件。
  • 它与需要该模块的文件不在同一个文件夹中。它位于名为__mocks__ 的文件夹中。我是 javascript 和节点 js 的新手,我没想到它会指向该模拟文件,除非指定完整路径,例如:require('__mocks__/firebase')。我没有责怪任何人没有答案,我只是让每个人都知道问题所在,不要混蛋
  • 我不想冒犯你,很高兴你发布解决方案。我只是想将这一点带入您的通知中,如果其他人由于安装版本等其他错误而出现与TypeError: firebase.initializeApp is not a function 相同的错误并来到这里寻找答案,他们将被误导。在这些情况下,必须删除帖子,以免其他人被误导。
  • 因为 jest 的模拟约定是将具有完全相同名称的文件放在名为 __mocks__ 的文件夹中,与要模拟的文件处于同一级别,并且由于 firebase 数据库是第一层可能会想嘲笑我认为这可能对像我这样的其他新手有帮助。
猜你喜欢
  • 2021-12-14
  • 2018-09-01
  • 1970-01-01
  • 2020-02-09
  • 2018-07-08
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多