为什么 process.env.FIRESTORE_EMULATOR_HOST 在测试环境中是未定义的?即使我已经运行了模拟器

如何解决为什么 process.env.FIRESTORE_EMULATOR_HOST 在测试环境中是未定义的?即使我已经运行了模拟器

我正在使用

  • 节点 14
  • firebase 函数测试:0.2.3
  • firebase 管理员:9.6.0
  • firebase 函数:3.13.2
  • firebase 工具:9.10.0
  • 摩卡咖啡:8.3.2,
  • ts 节点:9.1.1

如果我运行 firebase emulators:start

然后我希望 process.env 将具有类似的属性

"FUNCTIONS_EMULATOR": "true","FIRESTORE_EMULATOR_HOST": "localhost:8080"

现在我需要使用 mocha 为我的云函数创建测试,我将使用 Firestore 和函数模拟器对其进行测试,我给我的文件events_cron_job.test.ts

运行模拟器后,我尝试控制台记录这些值,但我得到了这样的未定义

enter image description here

我期待

console.log(process.env.FUNCTIONS_EMULATOR)  // will be "true"
console.log(process.env.FIRESTORE_EMULATOR_HOST) // will be "localhost:8080"

我认为这只会发生在测试环境中(我使用的是 mocha),我有常规的 http 触发器并且它按预期工作

在运行模拟器之前,我尝试在终端上执行此操作

export FIRESTORE_EMULATOR_HOST="localhost:8080"
export FUNCTIONS_EMULATOR="true"

后执行 firebase emulators:start ,但结果将是相同的,我仍然对这些值未定义

因为这些值是未定义的,所以如果我的笔记本电脑与互联网断开连接,那么这个测试将不会运行(即它只会访问生产服务器中的数据,而不是模拟器!),我希望测试仍然会运行即使没有互联网连接,因为我使用模拟器。

我使用

运行 mocha 测试
mocha -r ts-node/register src/tests/cloud_function_tests --recursive --extension .test.ts --timeout 60000 --exit

解决方法

正如您在此 Github issue comment 中看到的,为了使用 Firebase 模拟器运行测试,您应该使用以下命令来触发它:

  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\google\api_core\grpc_helpers.py",line 166,in error_remapped_callable
    return _StreamingResponseIterator(result,prefetch_first_result=prefetch_first)
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\google\api_core\grpc_helpers.py",line 89,in __init__
    self._stored_first_result = six.next(self._wrapped)
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\grpc\_channel.py",line 426,in __next__
    return self._next()
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\grpc\_channel.py",line 826,in _next
    raise self
grpc._channel._MultiThreadedRendezvous: <_MultiThreadedRendezvous of RPC that terminated with:
        status = StatusCode.UNKNOWN
        details = "Exception iterating requests!"
        debug_error_string = "None"
>

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\gevent\pywsgi.py",line 999,in handle_one_response
    self.run_application()
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\geventwebsocket\handler.py",line 75,in run_application
    self.run_websocket()
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\geventwebsocket\handler.py",line 52,in run_websocket
    list(self.application(self.environ,lambda s,h,e=None: []))
  File "C:\Python39\lib\site-packages\flask\app.py",line 2464,in __call__
    return self.wsgi_app(environ,start_response)
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\flask_sockets.py",line 45,in __call__
    handler(environment,**values)
  File "C:\Users\ADMIN\Desktop\python\vonageBot\echoServer.py",line 122,in echo_socket
    responses = client.streaming_recognize(streaming_config,requests)
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\google\cloud\speech_v1\helpers.py",line 81,in streaming_recognize
    return super(SpeechHelpers,self).streaming_recognize(
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\google\cloud\speech_v1\services\speech\client.py",line 616,in streaming_recognize
    response = rpc(requests,retry=retry,timeout=timeout,metadata=metadata,)
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\google\api_core\gapic_v1\method.py",line 145,in __call__
    return wrapped_func(*args,**kwargs)
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\google\api_core\retry.py",line 281,in retry_wrapped_func
    return retry_target(
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\google\api_core\retry.py",line 184,in retry_target
    return target()
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\google\api_core\timeout.py",line 102,in func_with_timeout
    return func(*args,**kwargs)
  File "C:\Users\ADMIN\AppData\Roaming\Python\Python39\site-packages\google\api_core\grpc_helpers.py",line 168,in error_remapped_callable
    six.raise_from(exceptions.from_grpc_error(exc),exc)
  File "<string>",line 3,in raise_from
google.api_core.exceptions.Unknown: None Exception iterating requests!
2021-04-19T08:52:01Z {'REMOTE_ADDR': '::1','REMOTE_PORT': '50054','HTTP_HOST': 'xxc8573d03e9.ngrok.io',(hidden keys: 30)} failed with Unknown

这是 Firebase 团队使用模拟器执行测试的方式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?