# #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.