繁体   English   中英

为什么在使用 firebase-functions-test、mocha 和 Emulator Suite 对 Firebase (Cloud) 函数进行单元测试时无法访问 .env 变量?

[英]Why can't I access .env variables when unit testing Firebase (Cloud) Functions with firebase-functions-test, mocha, and Emulator Suite?

我有一个使用 Functions、Storage 和 Auth 的 Firebase 项目,我想使用 mocha 和 Emulator Suite(已经为本地开发工作)做一些基本的单元测试。

我已经多次阅读文档,但我似乎不明白如何设置它。 我目前的具体挑战是,由于环境变量未加载,我似乎无法获得一个简单的 function 返回定义的环境变量以正确返回。

我的设置如下:

函数/index.js

const functions = require("firebase-functions")
const admin = require('firebase-admin')
admin.initializeApp()
const { getFunctions } = require('firebase-admin/functions')
...
exports.requiresEnvVariable = functions.https.onCall((data, context) => {
  return process.env.MYENV_VARIABLE || ':('
})
  

函数/测试/test.spec.js

const { expect } = require("chai")
const sinon = require("sinon")
const admin = require("firebase-admin")
  
console.log(process.env.GCLOUD_PROJECT)
  
const test = require("firebase-functions-test")({
  projectId: process.env.GCLOUD_PROJECT
}, 'serviceAccount.json')

// I've played with calling this here and stubbing, asmentioned in the docs. Nothing seems to work.
//admin.initializeApp()
//adminInitStub = sinon.stub(admin, 'initializeApp')

const myFunctions = require("../index")

describe("Unit tests", () => {
  it("A good and cool test description", async () => { 
    const wrapped = test.wrap(myFunctions.getTToken)
    const data = {}
    const result = await wrapped(data)
    expect('yayitworked').to.eql(result)
  })
})

功能/包.json

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "serve": "firebase emulators:start --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log",
    "tests": "mocha --exit tests/*.spec.js"
  },
  "engines": {
    "node": "18"
  },
  "main": "index.js",
  "dependencies": {
    "axios": "^1.1.3",
    "cors": "^2.8.5",
    "firebase-admin": "^11.4.1",
    "firebase-functions": "^4.1.1",
  },
  "devDependencies": {
    "chai": "^4.3.7",
    "firebase-functions-test": "^3.0.0",
    "mocha": "^10.2.0",
    "sinon": "^15.0.1"
  },
  "private": true
}

函数/.env

MYENV_VARIABLE=yayitworked

我从函数文件夹运行:

firebase emulators:exec 'npm run tests'

给出AssertionError: expected ':(' to deeply equal 'yayitworked'

为什么我不能访问环境变量?

简短的回答是 firebase firebase-functions-test package 不会加载存储在.env文件中的环境变量。 您需要使用https://www.npmjs.com/package/dotenv等包手动加载.env文件作为 mocha 测试设置的一部分。

更长的答案是问题中描述的设置 - 结合 Firebase Emulator 和 firebase firebase-functions-test package - 可能无法像您期望的那样工作。

跑步时

firebase emulators:exec 'npm run tests'

我们得到 2 个独立的requiresEnvVariable实例 function:

  1. 一个由 Firebase 模拟器启动。 这个 function 会加载.env变量,因为 Firebase 模拟器包含在启动 function 之前将环境变量加载到适当的.env文件中的逻辑。

  2. 一个通过你的摩卡测试旋转起来。 这个“函数”实际上是一个普通的 JS function 并将继承父进程中的环境变量。

使用firebase-functions-test编写的测试正在测试 (2) function,而不是 (1)。 为了调用 Firebase 模拟器启动的 function (1),您需要向 Firebase 模拟器公开的 URL 发出 HTTP 请求(参见示例代码

(旁注:firebase firebase-functions-test package 是在 Firebase 模拟器之前发布的,所以可以这么说,它不是“Firebase 模拟器感知”。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM