如何做一个适当的集成测试与firebase模拟器与所有服务在同一时间

dbf7pr2w  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(102)

我想测试一下我的firebase后端,包括firestore,auth和函数。有一些云函数在新用户创建或删除时,像apis一样影响firestore数据。

我想运行这样的测试。

1.我将在终端启动firebase模拟器(没有数据)。
1.运行测试文件。下面的一切都将在脚本中,所以没有一部分是手动的。
1.我将注册新用户。这些应该触发firebase功能,让说影响users收集。
1.测试users集合是否受到影响。
1.然后使用任何创建的用户(例如Jake Williams)进行假登录。
1.调用一些rest API。这些api将再次更改firestore数据。对于这些云函数,接收的auth将为Jake Williams
1.测试这些Firestore数据是否受到影响。
1.清理模拟器数据并运行其他测试。
我已经浏览了文档,但这些都不清楚。浏览了github/quickStart-testing,仍然没有帮助。我看到有教程分别测试Firestore规则和一些测试云功能。
我可以设置一个测试项目来满足我的上述需求吗?

myss37ts

myss37ts1#

我觉得Firebase指南令人困惑。他们提到了firebase emulators:exec "./my-test.sh",不确定my-test.sh是不是。通常在node.js测试工作流中看不到.sh文件。2-3天后,找到了自己问题的正确解决方案。

这里有些事你应该知道

1.firebase模拟器:exec
firebase emulators:exec 'npm run test'命令在firebase模拟器中运行你的测试文件。所以当你的测试文件使用firebase admin import * as admin from "firebase-admin";时,我认为这个firebase admin将链接到正在创建的模拟器示例。在那个测试文件中运行admin.auth().createUser(...),然后将在该模拟器上创建用户。此createUser还将触发云函数中的副作用。您只需等待5 sec,然后再测试触发函数的效果。
1.您需要使用项目ID初始化admin和firebase功能测试

import functionTest from 'firebase-functions-test'
import * as admin from "firebase-admin";
const PROJECT_ID = "your project id"

const test = functionTest({
    projectId: PROJECT_ID,
});
admin.initializeApp({
    projectId: PROJECT_ID,
})

1.如果要清除模拟器数据并在每次测试之间重新初始化应用程序

import axios from 'axios'
import * as admin from "firebase-admin";

const PROJECT_ID = "your project id"

const deletingFirebaseDataUrl: string = `http://127.0.0.1:8080/emulator/v1/projects/${PROJECT_ID}/databases/(default)/documents`;
const deletingAuthDataUrl: string = `http://localhost:9099/emulator/v1/projects/${PROJECT_ID}/accounts`;

async function initApps() {
    admin.initializeApp({
        projectId: PROJECT_ID,
    })
}

async function deleteAllDataAndApps() {
    admin.apps.forEach(app => app?.delete());
    await axios.delete(deletingFirebaseDataUrl) //
    await axios.delete(deletingAuthDataUrl)
    test.cleanup();
}

beforeEach(initApps)
afterEach(deleteAllDataAndApps)

查阅文件,我没有发现这些东西,或者我不清楚。

相关问题