我想测试一个firestore规则。下面是firestore.rules。我想检查这些安全规则是否有效。然后我尝试使用jest和firebase测试。但是,当执行“npm测试”时,出现错误“连接ECONFREFUSED 127.0.0.1:8080”。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /clubUsers/{uid} {
allow read: if request.auth != null
&& request.auth.uid == uid;
allow create: if request.auth != null
&& request.auth.uid == uid;
allow update: if request.auth != null
&& request.auth.uid == uid;
}
}
}
我的测试脚本在这里。
const firebase = require('@firebase/testing/');
const fs = require('fs');
const project_id = "PROJECT ID";
describe("testing firestore rules", () => {
beforeAll(
async () => {
await firebase.loadFirestoreRules({
projectId: project_id,
rules: fs.readFileSync('../../firestore.rules', 'utf8'),
});
}
);
afterEach(
async () => {
await firebase.clearFirestoreData({ projectId: project_id });
}
);
afterAll(
async () => {
await Promise.all(
firebase.apps().map((app) => app.delete())
);
}
);
function authedApp(auth) {
return firebase.initializeTestApp({
projectId: project_id,
auth: auth,
}).firestore();
}
describe("testing get and write", () => {
test("testing get", async () => {
const db = authedApp({ uid: 'UID' });
const message = db.collection("clubUsers").doc("UID");
await firebase.assertSucceeds(message.get());
})
test("testing write", async () => {
const db = authedApp({ uid: "UID" });
const message = db.collection("clubUsers").doc("UID");
await firebase.assertSucceeds(
message.set({ text: "hoge" })
);
})
})
})
我尝试了测试,而firebase模拟器是打开的。
我通过在终端上执行sudo lsof -P -i:8080
检查了什么正在使用端口8080。但是,没有任何东西使用端口8080。
1条答案
按热度按时间ttygqcqt1#
今天也遇到了这个问题......几个源代码(GitHub和here)提供了一个解决方案。这是一个调用
firebase.clearFirestoreData()
的问题,当模拟器在默认的host:port上找不到时就会发生。解决方案建议设置环境变量以定义适用于您的设置的主机和端口。例如:
使用
firebase emulators:start
启动模拟器后,您可以找到要使用的正确的host:port组合这个问题已经在新的模块化v9 JS SDK中得到了解决,但是需要对新的API进行一些重构(如docs中所定义的)。现在,您可以在初始化时指定host和port:
PS.不要像我一样被愚弄,以为127.0.0.1和localhost总是一样的!