NodeJS 在测试环境中更改 MongoDB 数据库名称

NodeJS change MongoDB database name on testing environment

我有这段代码可以连接到 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 来测试我的应用程序。问题是因为数据库名称来自 process.env.DB_NAME,在 运行 npm test 时修改了同一个数据库。有没有办法根据启动服务器的命令更改数据库名称,以便测试可以修改它自己的单独数据库?

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

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 变量。

在模块中做类似 process.env.MONGO_HOST='foo'; 的事情是一种代码味道——不要这样做。

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

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"
  }
}

请参阅示例存储库中的示例 here

如果我没理解错的话,您想在本地机器上有两个独立的环境:一个用于开发(有自己的数据库)和一个用于测试(有自己的数据库)。

这就是我做事的方式。

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

  • 据我了解,您正在使用 dotenv 软件包。您可以创建 .env 文件以供此包解析。例如,.env.dev 和 .env.test

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

    “脚本”:{
    "dev": "NODE_ENV=开发节点 ./server.js",
    "test": "NODE_ENV=test mocha ./test/test.js",
    },

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

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

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