【问题标题】:Simple Unit Testing of firebase rules in emulator always fails模拟器中firebase规则的简单单元测试总是失败
【发布时间】:2021-03-19 19:42:07
【问题描述】:

我正在尝试为我的 Firestore 规则设置单元测试,并且我遵循了 video tutorial,但由于某种原因,firebase.assertSucceeds.(testDoc.get()) 总是通过,即使我没有被安全规则允许。

安全规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

单元测试:

process.env.FIRESTORE_EMULATOR_HOST = 'localhost:8090';
const assert = require('assert');
const firebase = require('@firebase/testing');

const PROJECT_ID = 'my-proj-id';

describe("Security Rules",()=>{

    it("monkeytest", async()=>{
        const db = firebase.initializeTestApp({projectId:PROJECT_ID}).firestore();
        const testDoc = db.collection("foo").doc('bar');
        await firebase.assertSucceeds(testDoc.get());
    })
});

无论我对安全规则进行什么更改,此单元测试都始终通过。当我改用 firebase.assertFails(testDoc.get()) 时,无论我更改什么,测试总是失败。

【问题讨论】:

    标签: unit-testing google-cloud-firestore firebase-security


    【解决方案1】:

    我正在使用模拟器或 firebase tools version 9.6.0 来检查你的,运行以下命令:

    firebase tools --version
    

    在此版本中,您在firestore.rules 中所做的每一项更改都需要重新启动模拟器才能生效。 Ctrl-C 取消当前模拟器并再次运行它(确保 firestore.rules 中的更改已保存),通过执​​行以下命令:

    firebase emulators:start
    

    【讨论】:

    • 我使用的是9.3.0 版本,现在我更新为9.6.1。同样的问题,当我现在取消模拟器并再次运行测试时,测试也通过了,并且没有像以前那样“客户端离线”。我正在使用摩卡咖啡和@firebase/testing
    • 所以出于某种原因,即使我在firebase.json 中指定了另一个端口,但仍有一个模拟器在后台运行在端口 8080 上。单元测试总是针对这个模拟器进行测试,这意味着其他模拟器的任何更改/重新启动都没有效果。而且你提到的安全规则没有自动更新的bug没有在8080更新模拟器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2023-03-06
    相关资源
    最近更新 更多