![](/img/trans.png)
[英]How to import test data into Firebase Firestore emulator from production for easy testing?
[英]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.