Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在测试中获取serverless.yml中定义的环境变量_Node.js_Integration Testing_Jestjs_Serverless Framework - Fatal编程技术网

Node.js 如何在测试中获取serverless.yml中定义的环境变量

Node.js 如何在测试中获取serverless.yml中定义的环境变量,node.js,integration-testing,jestjs,serverless-framework,Node.js,Integration Testing,Jestjs,Serverless Framework,我使用无服务器框架在AWS上运行lambda函数 在myserverless.yml中,有一些从SSM获取的环境变量 当我为代码编写集成测试时,我需要代码包含环境变量,但我找不到一个好的方法来实现这一点 我不想只为测试复制所有变量定义,它们已经在serverless.yml中定义了。另外,有些是秘密,我无法将它们提交给源代码控制,因此我还必须在ci环境中重复它们 尝试使用serverless jest插件,但该插件不起作用且维护不好 我对解决方案的想法: 使tests execsls invok

我使用无服务器框架在AWS上运行lambda函数

在my
serverless.yml
中,有一些从SSM获取的环境变量

当我为代码编写集成测试时,我需要代码包含环境变量,但我找不到一个好的方法来实现这一点

我不想只为测试复制所有变量定义,它们已经在serverless.yml中定义了。另外,有些是秘密,我无法将它们提交给源代码控制,因此我还必须在ci环境中重复它们

尝试使用
serverless jest插件
,但该插件不起作用且维护不好

我对解决方案的想法:

  • 使tests exec
    sls invoke
    -这将起作用,但意味着代码无法调试,我不知道测试覆盖率,而且速度会很慢
  • 我自己解析
    serverless.yml
    并导出env变量-这是可能的,但重写仅为测试而提取SSM变量的逻辑似乎是错误的

  • 有什么想法吗?

    您是想做模拟单元测试,还是更像集成测试

    在第一种情况下,环境变量不需要实际值。模拟数据库,或任何需要设置环境变量的内容。这实际上是更好的方法,因为测试将在适当的模拟下超快速运行

    如果您实际上希望采用端到端/集成的方法,那么您可以使用javascript执行类似于
    sls invoke
    的操作。因此,就像对部署的api的常规网络调用一样


    另外,我建议不要将密钥存储在
    serverless.yml
    中。请改用
    secret:${env:MY_secret}
    语法(),并改用环境变量。如果您有一个ci/cd构建服务器,您可以在那里存储您的机密。

    我们最终使用的解决方案是一个名为的无服务器插件

    添加此插件后,您可以运行
    serverless export env
    将所有解析的环境变量导出到
    .env
    文件中。这将正确解析ssm参数,并使集成测试对我们来说更加简单

    顺便说一句,要从
    .env
    文件中获取环境变量集,请使用npm包


    由于找到了解决方案,您可以使用
    --require
    选项运行节点,将
    .env
    文件注入到无服务器命令中

  • 使用
    package.json
    在项目根目录下创建
    .env
    ,并在
    .env
    中列出变量
  • 通过
    添加-D serverless dotenv
    在项目中安装serverless和dotenv
  • 运行类似于
    node-r dotenv/config./node\u modules/.bin/sls invoke的命令

  • 然后,您可以在处理程序
    process.env.XXX

    中获取环境变量,我正在寻找集成测试的解决方案。更新问题以澄清。谢天谢地,我的主要目标是获取无服务器知道如何解析的环境变量,而无需显式定义它们。例如,如果我有一个来自AWS SSM或S3文件之类的配置,serverless知道如何解决这些问题。我不想在.env文件中再次显式定义它们