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 文件加载您的环境变量。
我有这段代码可以连接到 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 文件加载您的环境变量。