2016-02-11 93 views
3

我刚开始有一个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); 

    }); 
}); 

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

回答

4

好的,我玩过用一些不同的方法来处理这个问题。

我发现最好的选择,因为我的特殊用途的情况下,为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这种情况下会用我的测试配置。

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

4

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

可以在多种格式(以.json,.js文件,YAML等)使用默认设置指定你的配置,你需要在你的应用程序根目录中创建一个文件夹config,并与您的默认配置一个default.<format>

要覆盖测试,您可以在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); 
相关问题