使用Firebase Auth emulator以编程方式创建用户

使用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

我正在尝试使用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/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