如何模拟我的配置文件进行测试?
我刚开始有一个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);
});
});
该规范将失败,因为该应用程序将使用配置文件中的秘密(空字符串),而不是我的测试秘密。
好的,我玩过用一些不同的方法来处理这个问题。
我发现最好的选择,因为我的特殊用途的情况下,为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=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);