簡體   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