[英]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:
一个由 Firebase 模拟器启动。 这个 function 会加载.env
变量,因为 Firebase 模拟器包含在启动 function 之前将环境变量加载到适当的.env
文件中的逻辑。
一个通过你的摩卡测试旋转起来。 这个“函数”实际上是一个普通的 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.