我想在测试时覆盖一些值,特别是将http服务的重试次数设置为1(立即失败,不重试)。我们的项目使用node-config
。根据{{3}},我可以使用NODE_CONFIG
env变量覆盖:
node myapp.js --NODE_CONFIG='{"Customer":{"dbConfig":{"host":"customerdb.prod"}}}'
我宁愿在我的测试中这样做,但不是所有的测试。 docs表示您可以通过设置ALLOW_CONFIG_MUTATIONS
来允许配置变种。
process.env.ALLOW_CONFIG_MUTATIONS = "true";
const importFresh = require('import-fresh');
importFresh("config");
process.env.NODE_CONFIG = JSON.stringify({httpServices:{integration:{enrich: {retryInterval: 1, retries: 1}}}});
expect(process.env.NODE_CONFIG, 'NODE_CONFIG not set').to.exist();
expect(process.env.NODE_CONFIG, 'NODE_CONFIG not set').to.match(/retryInterval/);
expect(process.env.ALLOW_CONFIG_MUTATIONS, 'ALLOW_CONFIG_MUTATIONS not set').to.equal("true");
const testConfig = require("config");
console.dir(testConfig.get("httpServices.integration.enrich"));
expect(testConfig.get("httpServices.integration.enrich.retryInterval"), 'config value not set to 1').to.equal(1);
结果:
{ url: 'https://internal-**********',
retryInterval: 5000,
retries: 5 }
`Error: config value not set to 1: Expected 5000 to equal specified value: 1`
如何让此覆盖工作?
(期望来自Hapi.js代码库)
答案 0 :(得分:5)
我是node-config
的维护者之一。您的错误是您第二次使用require
时应该再次使用importFresh
。
首次使用“importFresh()”与require()
没有任何区别,因为它是第一次使用require()
。
设置一些变量后,调用require()
,它将返回已生成和缓存的config
副本,忽略环境变量集的影响。
您只需使用importFresh()
一次,目前使用require()
。这将导致返回配置对象的“新”副本,如预期的那样。
答案 1 :(得分:1)
仅更改config
的属性对我有用。
例如:
const config = require( 'config' );
config.httpServices.integration.enrich.retryInterval = 1;
// Do your tests...
UPD:请确保在任何人调用第一个config.get()
之前先进行覆盖,因为一旦任何客户端通过config
使用值,get()
对象就变得不可变。>
答案 2 :(得分:0)
最好在配置文件夹中创建development.json,production.json et test.json.node-config将使用它的app配置。 你只需将你的NODE_ENV设置为使用特定文件。 希望它有所帮助:)