【问题标题】:How do I mock my config file for testing?如何模拟我的配置文件进行测试?
【发布时间】:2016-05-22 20:49:12
【问题描述】:

我有一个刚启动的 Koa 应用程序,我需要测试一些从配置文件中获取数据的东西。

我需要使用特定数据进行测试,但我不确定如何修改测试从配置文件接收到的数据。

例子:

app.js

var router = require('koa-router');
var config = require('./config.js');
var db     = require('./db.js');
var auth   = require('./auth');
var app    = require('koa')();

router.get('/', function *() {
  if(auth(this.req, config.credentials.secret)) { // Authenticates request based on a hash created using a shared secret
    this.body = "Request has been authenticated";
  }
});

app.use(router.routes());
app = module.exports = http.createServer(app.callback());

app.listen(3000);

appSpec.js

var request = require('supertest');
var app = require('../app.js');

describe('app', function() {
  it('should authenticate all requests against config shared secret', function() {
    var secret    = 'some_secret';
    var validHash = /* hash created from test secret and query */;

    request(app)
      .get('/')
      .query({query: 'some_query'})
      .query({hash: validHash})
      .expect(403, done);

  });
});

此规范将失败,因为应用程序将使用配置文件中的密钥(空字符串)而不是我的测试密钥。

【问题讨论】:

    标签: javascript node.js unit-testing tdd koa


    【解决方案1】:

    我将node-config 用于我的配置文件和基于机器或环境变量的配置加载。

    您可以以多种格式(.json、.js、yaml 等)指定您的配置。使用默认设置,您需要在应用根目录中创建一个 config 文件夹,并使用您的默认配置。

    要覆盖它以进行测试,您可以在 config 目录中创建一个 test.<format> 文件。当您设置NODE_ENV=test 时,node-config 将看到加载您的默认配置文件,然后它将加载您的测试配置文件,如果值有任何冲突,您的测试配置文件将覆盖默认文件中的值.

    这里是在node-config 中设置Configuration Files 的完整文档

    下面是使用node-config.js 配置文件格式的示例。

    ./config/default.js

    module.exports = {
      credentials: {
        secret: ''
      }
    }
    

    ./config/test.js

    module.exports = {
      credentials: {
        secret: 'abcdef123456'
      }
    }
    

    app.js

    var router = require('koa-router');
    var config = require('config');
    var db     = require('./db.js');
    var auth   = require('./auth');
    var app    = require('koa')();
    
    var credentials = config.get('credentials');
    
    router.get('/', function *() {
      if(auth(this.req, credentials.secret)) { // Authenticates request based on a hash created using a shared secret
        this.body = "Request has been authenticated";
      }
    });
    
    app.use(router.routes());
    app = module.exports = http.createServer(app.callback());
    
    app.listen(3000);
    

    【讨论】:

    • 当你想用不同的秘密值进行测试时怎么办?例如,当 secret 为 null 时编写测试?
    【解决方案2】:

    好的,我尝试了一些不同的方法来处理这个问题。

    对于我的特定用例,我发现的最佳选择是proxyquire。它是一个 npm 包,可让您覆盖测试套件中所需的任何文件中的依赖项。

    所以如果我正在测试这个模块:

    ./controllers/myController.js

    var config = require('../config.js');
    
    module.exports = function() {
     // Do some stuff
    };
    

    我会这样做:

    ./test/controllers/myControllerSpec.js

    var proxyquire = require('proxyquire');
    var config = {
      credentials: {
        secret: 'my_secret'
      }
      // other fake config stuff
    };
    var myController = proxyquire('../../controllers/myController.js', {'../config.js', config});
    
    describe('myController', function() {
      // TESTS
    });
    

    这个myController 实例将使用我的测试配置。

    这不适用于端到端测试,除非您导入配置的唯一位置是主应用文件。

    【讨论】:

      【解决方案3】:

      Jest 对这种情况有很好的支持。在您的测试文件中,添加

      jest.mock('../config.js', () => ({ 
        credentials: {
          secret: 'my_secret'
        }
        // other fake config stuff }));
      

      【讨论】:

        猜你喜欢
        • 2018-02-05
        • 1970-01-01
        • 2012-06-29
        • 2021-08-26
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多