【问题标题】:NodeJS change MongoDB database name on testing environmentNodeJS 在测试环境中更改 MongoDB 数据库名称
【发布时间】:2020-09-09 18:09:54
【问题描述】:

我有这段代码可以连接到 MongoDB:

MongoClient.connect(
      process.env.MONGO_HOST,
      { useUnifiedTopology: true },
      function (err, client) {
        _db = client.db(process.env.DB_NAME);
        _client = client;
        return callback(err);
      }
    );

我正在使用 mocha 和 chai 来测试我的应用程序。问题是由于 db 名称来自 process.env.DB_NAME,因此在运行 npm test 时修改了相同的数据库。有没有办法根据启动服务器的命令更改数据库名称,以便测试可以修改它自己的单独数据库?

【问题讨论】:

  • 为什么在运行测试时要传递“实时”环境变量?只需传递您的测试变量。你甚至可以在命令行中提供它们:MONGO_HOST=localhost DB_NAME=test npm test 或者将它们添加到 package.json 中的 npm 脚本命令行中。
  • @jishi 除了这些之外,还有几个变量需要传递。是否可以在测试中要求完全不同的环境?那也行。
  • 这就是 ENV 变量的重点,它们是动态的,取决于您运行它们的时间和地点。您是否使用 dotenv 或类似的东西,并从您的 repo 中的签入文件中加载这些?这可以解释你的困惑。恕我直言,这违背了使用 ENV 变量的全部目的。
  • No @jishi ENV 未签入,我正在使用 dotenv。我想要实现的是在本地编码时使用开发数据库,​​在运行测试时使用测试数据库。两者基本上都发生在同一台设备上。

标签: node.js mongodb mocha.js chai


【解决方案1】:

如果我想将我的测试配置签入 repo(因为它不依赖于你的开发环境的配置方式),我通常会做什么,我添加一个文件夹和一个我知道将首先加载的测试文件:

tests
 \ 00-init
   \ 00-init.js

只包含

process.env.MONGO_HOST = 'localhost';
process.env.DB_NAME = 'test';

当然,如果不同的开发人员使用不同的主机和数据库名称进行测试,这实际上并不适用,那么他们应该在运行测试时提供自己的 ENV 变量。

如果您在 IDE 中使用测试运行程序,您通常可以指定要设置的 ENV 变量,否则您可以为您的终端指定它们,或者在您调用命令行时直接指定它们(对于 unix shell 类型的终端):

MONGO_HOST=localhost DB_NAME=test npm test

在您使用 dotenv 的情况下,您仍然可以像这样覆盖任何 ENV 变量,因为 dotenv 不会覆盖已经存在的 ENV 变量。

【讨论】:

    【解决方案2】:

    如果我对您的理解正确,您希望在本地机器上有两个独立的环境:一个用于开发(带有自己的数据库),一个用于测试(带有自己的数据库)。

    这就是我做事的方式。

    • 我会将环境变量保留为未签入文件(因为它们通常包含私钥等)。 (因此,它们被添加到 .gitignore 文件中,特别是如果它位于可公开访问的存储库中)。这还具有为您的机器固定 .env 变量的好处。 (否则,如果您签入文件,其他具有不同值的开发人员,他们将不得不在每次从 master 拉取时修改这些变量。

    • 据我了解,您正在使用 dotenv 包。你可以创建 .env 文件来被这个包解析。例如,.env.dev 和 .env.test

    • 在您的 package.json 中,您修改您的开发和测试脚本以将节点设置为特定环境。例如,

      “脚本”:{
      "dev": "NODE_ENV=dev node ./server.js",
      "test": "NODE_ENV=test mocha ./test/test.js",
      },

    • 作为最后一步,在应用程序的相关部分尽早(例如,在 server.js 中的服务器启动期间),您应该这样做

      require('dotenv').config({ path: `.env.${process.env.NODE_ENV}` }).

    • 现在,process.env 已从正确的 .env 文件中加载了您的环境变量。

    【讨论】:

      【解决方案3】:

      在模块中执行process.env.MONGO_HOST='foo'; 之类的操作是代码异味——不要这样做。

      在最基本的 Node 项目设置中,您可以修改“测试”脚本,以便将 tets/本地环境变量添加到您的测试运行程序和启动脚本中。示例:

      package.json

      {
        "name": "@jameswomack/npm-config-example",
        "scripts": {
          "test": "$npm_package_config_dblocal mocha ./src/*.test.js",
          "start-server": "node ./src/index.js",
          "start:local": "$npm_package_config_dblocal npm run start-server",
          "start:prod": "$npm_package_config_dbprod npm run start-server"
        },
        "config": {
          "dbprod": "env MONGO_HOST=https://fu.manchu DB_NAME=1337;",
          "dblocal": "env MONGO_HOST=localhost DB_NAME=local;"
        },
        "devDependencies": {
          "mocha": "8.1.3"
        }
      }
      

      查看示例 repo here中的示例

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-17
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        • 2018-04-26
        相关资源
        最近更新 更多