【问题标题】:How to setup a test suit for unit testing Firebase Functions that connect with emulators, specifically the Firestore emulator?如何设置测试套件以对与模拟器(尤其是 Firestore 模拟器)连接的 Firebase 函数进行单元测试?
【发布时间】:2021-06-10 09:21:46
【问题描述】:

我想设置一个测试套件来为我的 Firebase 应用程序编写一个单元测试,该应用程序连接到在端口 8080 上本地运行的 Firestore 模拟器

这是我在 index.js 中的 firebase 配置

    const functions = require("firebase-functions");
    const dotenv = require('dotenv');
    dotenv.config();

    const emailFormatter = require("./emailFormatter");

    const admin = require("firebase-admin");

    admin.initializeApp();
    const db = admin.firestore();

以下是我的functions.test.js

    const admin = require('firebase-admin');
    const serviceAccount = require('../../../fir-react-mailer-firebase-adminsdk-wfei1-0fff68d44e.json');

    const testConfig = {
       credential: admin.credential.cert(serviceAccount),
       databaseURL: 'http://localhost:8080'
    }

    const testApp = admin.initializeApp(testConfig, 'test');

    const projectConfig = {
       projectId: 'fir-react-mailer',
       databaseURL: 'http://localhost:8080',
    }

    const testF = require('firebase-functions-test')(projectConfig, serviceAccount);

    const myFinctions = require('../index')

    let db = admin.firestore(testApp)

这是我的package.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",
        "test": "jest"
      },
      "engines": {
        "node": "12"
      },
      "dependencies": {
        "chalk": "^4.1.0",
        "dotenv": "^8.2.0",
        "firebase-admin": "^8.9.0",
        "firebase-functions": "^3.3.0",
        "nodemailer": "^6.4.6"
      },
      "devDependencies": {
        "@types/jest": "^26.0.20",
        "firebase-functions-test": "^0.1.7",
        "jest": "^26.6.3"
      },
      "private": true
    }

在运行命令 npm run test 时,我在控制台上收到以下错误。

如果我做错了什么,请向我提出建议。我是 Firebase 的新手,所以整个设置很混乱。

【问题讨论】:

  • 我不完全确定这是否会有所帮助,但看起来它正在尝试读取凭据文件?您是否尝试过创建一个或确保它在本地存在?这里还有更多人在处理类似的问题:stackoverflow.com/questions/54711038/…

标签: node.js firebase unit-testing google-cloud-firestore google-cloud-functions


【解决方案1】:

我也遇到了这个问题,这是因为我必须提供 serviceAccount json 文件相对于函数文件夹的位置。我也没有导入它,而是提供了字符串。所以如果我的项目是这样的:

functions
 |
 +-- src
 |    
 +-- test
 |  |  
 |  \-- functions.test.js
 |    
 +-- package.json
 +-- service-account.json

我会将您的函数测试变量更改为:

const testF = require('firebase-functions-test')(projectConfig, "./service-account.json");

您也可以尝试只调用一次 initializeApp。看起来您正在调用 initializeApp() 两次。第一个在第 9 行的测试代码中,然后在您的实际代码中。测试代码中的那个看起来是对的,但是你的实际代码在没有 testConfig 的情况下再次调用它。

也许尝试将admin.initializeApp() 包装在 if 语句中,这样它就不会被初始化,除非它必须这样做(这将在生产中发生)。

if (admin.apps.length === 0) {
  admin.initializeApp();
}

【讨论】:

    【解决方案2】:

    根据documentation

    创建服务帐户后,您需要将服务帐户密钥下载到运行应用程序的计算机上。您可以使用GOOGLE_APPLICATION_CREDENTIALS 环境变量或编写代码将服务帐户密钥传递给客户端库。

    您需要像这样设置 Windows 环境变量:

    使用 PowerShell:

    $env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\my-key.json"
    

    例如:

    $env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\my-key.json"
    

    使用命令提示符:

    set GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\my-key.json"
    

    如果可以的话,尽量避免对凭据文件的位置进行硬编码,以减少编写的代码量,这意味着您的代码是可重用的。

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2015-11-29
      • 2019-02-22
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多