使用Firebase Auth emulator以编程方式创建用户
我正在尝试使用Firebase Auth emulator编写jest测试,并继续收到以下CORS错误使用Firebase Auth emulator以编程方式创建用户,firebase,firebase-authentication,jestjs,jsdom,firebase-tools,Firebase,Firebase Authentication,Jestjs,Jsdom,Firebase Tools,我正在尝试使用Firebase Auth emulator编写jest测试,并继续收到以下CORS错误 console.error 错误:标题X客户端版本被禁止 dispatchError(/Users/me/my project/node_modules/jsdom/lib/jsdom/living/xhr/xhr utils.js:62:19) 在validCORSPreflightHeaders(/Users/me/my project/node_modules/jsdom/lib/jsd
console.error
错误:标题X客户端版本被禁止
dispatchError(/Users/me/my project/node_modules/jsdom/lib/jsdom/living/xhr/xhr utils.js:62:19)
在validCORSPreflightHeaders(/Users/me/my project/node_modules/jsdom/lib/jsdom/living/xhr/xhr-utils.js:99:5)
应要求。(/Users/me/my project/node_modules/jsdom/lib/jsdom/living/xhr/xhr-utils.js:367:12)
at Request.emit(events.js:315:20)
at Request.onRequestResponse(/Users/me/my project/node_modules/Request/Request.js:1059:10)
在ClientRequest.emit(events.js:315:20)
在HTTPParser.parserOnIncomingClient[作为onIncoming](_http_client.js:641:27)
在HTTPParser.parserOnHeadersComplete(_http_common.js:126:17)
在Socket.socketOnData(_http_client.js:509:22)
在Socket.emit(events.js:315:20)未定义
测试非常简单:
从“@testing library/react hooks”导入{renderHook,act}”
从“冒牌货”进口冒牌货
从“/index”导入{useAuth,FirebaseProvider,firebase}
常量包装器=({firebase,children})=>{
返回{children}
}
const createUser=({email=faker.internet.email(),password=faker.internet.password({length:6})}={})=>{
返回火基
.auth()
.createUserWithEmailAndPassword(电子邮件,密码)
。然后(用户=>user)
}
const signUserIn=({email,password}={})=>{
返回火基
.auth()
.使用电子邮件和密码登录(电子邮件、密码)
。然后(用户=>user)
}
描述(“useAuth”,()=>{
它(“将返回用户”,异步()=>{
const{result}=renderHook(()=>useAuth(),{wrapper,initialProps:{firebase}})
const email=faker.internet.email()
const password=faker.internet.password()
等待动作(异步()=>{
const user=wait createUser({email,password})//此操作失败
等待signUserIn({email,password})//这也是如此
})
expect(result.user).toEqual({email,password})
})
})
作为参考,索引文件:
const FirebaseProvider=({children,firebase})=>{
const firestore=firebase.firestore()
const auth=firebase.auth()
if(useEmulator()){
使用仿真器(“本地主机”,8080)
auth.useEmulator(“http://localhost:9099/")
}
常量值={firestore,auth}
返回{children}
}
const-throwError=hook=>{
抛出新错误(`${hook}必须在FirebaseProvider`中使用)
}
const useAuth=()=>{
const context=useContext(FirebaseContext)
if(context==未定义)throwerr(“useAuth”)
const[user,setUser]=useState()
useffect(()=>{
const cleanup=context.auth.onAuthStateChanged(authUser=>{
authUser?setUser(authUser):setUser(null)
})
return()=>cleanup()
})
返回{…context.auth,user}
}
我尝试过使用实际仿真器使用的REST端点(见下文),它以相同的方式出错
http://localhost:9099/identitytoolkit.googleapis.com/v1/projects/<my-project>/accounts
http://localhost:9099/identitytoolkit.googleapis.com/v1/projects//accounts
在使用jest时,是否有任何方法可以让它运行?或者,我是否需要使用emulator UI创建帐户,在运行测试时将其导出并重新导入
我发现我可以使用下面的REST端点在测试中生成一个用户,但是它绕过了仿真器,生成了一个真正的用户
https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=<api-key>
https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=
更新jsdom版本
此新版本现在支持访问控制允许标头的通配符,因此对于使用Create React App创建的项目,更新到此版本或将其用作解决方案可以解决此问题
16.5.2版之前的jsdom解决方案
这个错误是由jsdom引发的,因为它不支持访问控制允许头的通配符,但firebase使用通配符(请参见此和此)。有两个打开的拉取请求来修复此问题:和
可以通过在节点_modules
文件夹中手动更改相关代码,或者在包中使用fork作为依赖项来解决此问题。json
:
"jsdom": "silviot/jsdom#fix/allow-headers"
"scripts": {
"prepare": "cd node_modules/jsdom && yarn"
},
如果jsdom
不是直接依赖项,那么您可以在顶层向package.json
添加以下内容:
"resolutions": {
"jsdom": "silviot/jsdom#fix/allow-headers"
}
如果使用fork,则jsdom
文件夹中缺少一些自动生成的文件。可以通过在文件夹中运行npm install
或warn install
来生成这些文件。要自动执行此操作,您可以将prepare
脚本添加到package.json
:
"jsdom": "silviot/jsdom#fix/allow-headers"
"scripts": {
"prepare": "cd node_modules/jsdom && yarn"
},
更新jsdom版本 此新版本现在支持访问控制允许标头的通配符,因此对于使用Create React App创建的项目,更新到此版本或将其用作解决方案可以解决此问题 16.5.2版之前的jsdom解决方案 这个错误是由jsdom引发的,因为它不支持访问控制允许头的通配符,但firebase使用通配符(请参见此和此)。有两个打开的拉取请求来修复此问题:和 可以通过在
节点_modules
文件夹中手动更改相关代码,或者在包中使用fork作为依赖项来解决此问题。json
:
"jsdom": "silviot/jsdom#fix/allow-headers"
"scripts": {
"prepare": "cd node_modules/jsdom && yarn"
},
如果jsdom
不是直接依赖项,那么您可以在顶层向package.json
添加以下内容:
"resolutions": {
"jsdom": "silviot/jsdom#fix/allow-headers"
}
如果使用fork,则jsdom
文件夹中缺少一些自动生成的文件。可以通过在文件夹中运行npm install
或warn install
来生成这些文件。要自动执行此操作,您可以将prepare
脚本添加到package.json
:
"jsdom": "silviot/jsdom#fix/allow-headers"
"scripts": {
"prepare": "cd node_modules/jsdom && yarn"
},
我尝试过这些建议,它们都会导致
找不到模块的相同结果。/jsdo