0

我在 hapi 服务器启动之前添加了一些配置值。应用程序运行良好,尽管在测试中我不能使用 config.get()。我可以使用proxyquire。所以我想知道

  • “动态”添加配置文件是不好的设计吗?
  • 有没有办法可以在这种情况下使用 config.get() ?
  • 任何替代方法?

    //initialize.js
    
    const config = require('config');
    
    async function startServe() {
      const someConfigVal = await callAPIToGetSomeJSONObject();
      config.dynamicValue = someConfigVal;
      server.start(); 
    }
    
    //doSomething.js
    
    const config = require('config');
    
    function doesWork() {
      const valFromConfig = config.dynamicValue.X;
      // In test I can use proxiquire by creating config object
      ...
    }
    
    function doesNotWork() {
      const valFromConfig = config.get('dynamicValue.X'); 
      // Does not work with sinon mocking as this value does not exist in config when test run.
      // sinon.stub(config, 'get').withArgs('dynamicValue.X').returns(someVal);
      .....
    }
    
4

1 回答 1

0

背景:测试。

  • “动态”添加配置文件是不好的设计吗?=> 不,我以前做过。测试代码在测试中更改配置文件:default.json 以检查被测函数是否按预期运行。我使用了几个配置实用程序
  • 有没有办法可以在这种情况下使用 config.get() ?=> 是的。关于 sinon 的用法,请参见下面的示例,它使用 mocha。您需要在被测函数使用它之前定义存根/模拟,并且不要忘记恢复存根/模拟。还有与此相关的官方文档:Altering configuration values for testing at runtime,但不使用 sinon。
const config = require('config');
const sinon = require('sinon');
const { expect } = require('chai');

// Example: simple function under test.
function other() {
  const valFromConfig = config.get('dynamicValue.X');
  return valFromConfig;
}

describe('Config', function () {
  it ('without stub or mock.', function () {
    // Config dynamicValue.X is not exist.
    // Expect to throw error.
    try {
      other();
      expect.fail('expect never get here');
    } catch (error) {
      expect(error.message).to.equal('Configuration property "dynamicValue.X" is not defined');
    }
  });

  it('get using stub.', function () {
    // Create stub.
    const stubConfigGet = sinon.stub(config, 'get');
    stubConfigGet.withArgs('dynamicValue.X').returns(false);
    // Call get.
    const test = other();
    // Validate te result.
    expect(test).to.equal(false);
    expect(stubConfigGet.calledOnce).to.equal(true);
    // Restore stub.
    stubConfigGet.restore();
  });

  it('get using mock.', function () {
    // Create mock.
    const mockConfig = sinon.mock(config);
    mockConfig.expects('get').once().withArgs('dynamicValue.X').returns(false);
    // Call get.
    const test = other();
    // Validate te result.
    expect(test).to.equal(false);
    // Restore mock.
    expect(mockConfig.verify()).to.equal(true);
  });
});

希望这可以帮助。

于 2020-05-28T05:31:00.593 回答