Простое модульное тестирование правил firebase в эмуляторе всегда завершается неудачей

# #unit-testing #google-cloud-firestore #firebase-security

Вопрос:

Я пытаюсь настроить модульное тестирование для своих правил firestore, и я следовал видео-уроку, но по какой-то причине 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()) вместо этого тест, он всегда терпит неудачу, независимо от того, что я изменяю.

Ответ №1:

Я использую эмулятор или firebase tools version 9.6.0 , чтобы проверить ваш, выполните команду ниже:

 firebase tools --version
 

В этой версии все изменения firestore.rules , внесенные вами, должны перезапустить эмулятор, чтобы он вступил в силу. Ctrl-C чтобы отменить текущий эмулятор и запустить его снова(убедитесь, что изменения firestore.rules были сохранены), выполните команду ниже:

 firebase emulators:start
 

Комментарии:

1. Я использовал версию 9.3.0 , и теперь я обновился до 9.6.1 . Та же проблема, и когда я теперь отменяю эмулятор и снова запускаю тест, тест также проходит, и «клиент отключен», как и раньше, отсутствует. Я использую мокко и @firebase/testing

2. поэтому по какой-то причине на порту 8080 в фоновом режиме работал эмулятор, хотя я указал другой порт firebase.json . Модульный тест всегда тестировал этот эмулятор, что означает, что любые изменения / перезапуск другого эмулятора не имели никакого эффекта. И ошибка, из-за которой правило безопасности не обновлялось автоматически, как вы упомянули, не обновило эмулятор на 8080.