[英]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.