繁体   English   中英

如何设置用于单元测试的测试套件 Firebase 与模拟器连接的功能,特别是 Firestore 模拟器?

[英]How to setup a test suit for unit testing Firebase Functions that connect with emulators, specifically the Firestore emulator?

我想设置一个测试套件来为我的 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 运行测试时,我在控制台上收到以下错误。

在此处输入图像描述

请向我建议,如果我做错了什么。 我是 Firebase 的新手,所以整个设置令人困惑。

我也遇到了这个问题,这是因为我必须提供与函数文件夹相关的 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();
}

根据文档

创建服务帐户后,您需要将服务帐户密钥下载到运行应用程序的计算机上。 您可以使用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"

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

暂无
暂无

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

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