簡體   English   中英

如何模擬我的配置文件進行測試?

[英]How do I mock my config file for testing?

我有一個剛剛啟動的 Koa 應用程序,我需要測試一些從配置文件中獲取數據的東西。

我需要使用特定數據進行測試,但我不確定如何修改測試從配置文件接收的數據。

例子:

應用程序.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);

  });
});

此規范將失敗,因為應用程序將使用配置文件(空字符串)中的機密而不是我的測試機密。

好吧,我嘗試了一些不同的方法來處理這個問題。

對於我的特定用例,我發現的最佳選擇是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實例將使用我的測試配置。

這不適用於端到端測試,除非您導入配置的唯一位置是主應用程序文件。

我將node-config用於我的配置文件和基於機器或環境變量的配置加載。

您可以以多種格式(.json、.js、yaml 等)指定您的配置。使用默認設置,您需要在您的應用程序根目錄中創建一個config文件夾,並使用您的默認配置創建一個default.<format>

要覆蓋它以進行測試,您可以在config目錄中創建一個test.<format>文件。 當您設置NODE_ENV=testnode-config將看到加載您的默認配置文件,然后它將加載您的測試配置文件,如果這些值存在任何沖突,您的測試配置文件將覆蓋默認文件中的值.

以下是在node-config設置配置文件的完整文檔

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

./config/default.js

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

./config/test.js

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

應用程序.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);

Jest 對這種情況有很好的支持。 在您的測試文件中,添加

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM