ทั้ง Cloud Firestore และ Realtime Database ใช้ภาษากฎที่มีประสิทธิภาพและกระชับ ที่สร้างขึ้นมาโดยเฉพาะเพื่อควบคุมการรักษาความปลอดภัยของข้อมูลและการควบคุมการเข้าถึง อย่างไรก็ตาม เนื่องจากกฎมีความยาวขึ้นและซับซ้อนมากขึ้น คุณอาจต้องการความช่วยเหลือในการแก้ไขข้อผิดพลาด ในพฤติกรรมของตน
Firebase Emulator ประกอบด้วยความสามารถในการสร้างรายงานความครอบคลุมของกฎ ดูได้ว่านิพจน์ย่อยแต่ละรายการได้รับการประเมินอย่างไรเมื่อคุณทำซ้ำ ข้อผิดพลาด รายงานยังให้ข้อมูลเกี่ยวกับความถี่ที่แต่ละกรณีทดสอบใช้กฎ เช่น เทคนิค "ความครอบคลุมของบรรทัด" แบบดั้งเดิม
สร้างรายงาน
หลังจากใช้งานชุดการทดสอบแล้ว คุณจะเข้าถึงการทดสอบได้ รายงานที่ครอบคลุมซึ่งแสดงวิธีประเมินกฎความปลอดภัยแต่ละกฎ
หากต้องการดูรายงาน ให้ค้นหาปลายทางที่เปิดเผยในโปรแกรมจำลอง กำลังทำงาน สำหรับเวอร์ชันที่เหมาะกับเบราว์เซอร์ ให้ใช้ URL ต่อไปนี้
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Realtime Database
http://localhost:9000/.inspect/coverage?ns=<database_name>
ซึ่งจะแบ่งกฎออกเป็นนิพจน์และนิพจน์ย่อยที่ วางเมาส์เหนือข้อมูลเพิ่มเติม รวมถึงจำนวนการประเมินและค่า ส่งคืนแล้ว สำหรับข้อมูลนี้ในเวอร์ชัน JSON ดิบ ให้ใส่ URL ต่อไปนี้ในข้อความค้นหา
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
Realtime Database
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
การแก้ไขข้อบกพร่องของกฎตัวอย่าง
เพื่อให้สร้างรายงานการทดสอบได้อย่างง่ายดาย ให้ใช้การเริ่มต้นใช้งานโปรแกรมจำลองอย่างรวดเร็วใน GitHub สำหรับ Cloud Firestore และ Realtime Database การเริ่มต้นใช้งานเหล่านี้จะแนะนำวิธีติดตั้งและเริ่มต้นโปรแกรมจำลองอย่างถูกต้อง จากนั้นสร้างการทดสอบตัวอย่างจากชุดกฎตัวอย่าง
ลองดูตัวอย่างแอปที่ใช้ Cloud Firestore ซึ่งนับจํานวนครั้งที่ผู้ใช้คลิกปุ่ม แอปใช้กฎต่อไปนี้
Cloud Firestore
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow write: if request.resource.data.value == resource.data.value +1; } } }
หากต้องการแก้ไขข้อบกพร่องในกฎที่แสดงด้านบน ให้ใช้ตัวอย่างต่อไปนี้ การทดสอบ JavaScript:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
โปรแกรมจำลองจะสร้างรายงานที่อยู่ใน URL ที่ระบุไว้ข้างต้น
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
รายงานแสดงข้อผิดพลาดที่ไม่ได้ระบุและค่า Null ต่อไปนี้
ปัญหาของตัวอย่างที่เฉพาะเจาะจงนี้ก็คือ กฎไม่ได้แยกความแตกต่างระหว่างการสร้างเอกสารกับการอัปเดตเอกสาร ดังนั้น ไม่อนุญาตให้เขียนหากไม่มีเอกสาร และไม่สามารถ ถูกสร้างขึ้นเนื่องจากไม่มีอยู่ การแยก "เขียน" ออกเป็น 2 การดำเนินการที่เฉพาะเจาะจงมากขึ้น ได้แก่ "สร้าง" และ "อัปเดต" ช่วยแก้ปัญหาได้
Cloud Firestore
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow create: if request.resource.data.value == 0; allow update: if request.resource.data.value == resource.data.value +1; } } }
รายงานที่สร้างขึ้นจะแสดงความถี่ในการใช้กฎแต่ละกฎ ส่งคืนแล้ว