如何模拟我的配置文件进行测试?
How do I mock my config file for testing?
我有一个刚开始使用的 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);
});
});
此规范将失败,因为应用程序将使用配置文件中的密码(空字符串)而不是我的测试密码。
我将 node-config 用于我的配置文件和基于机器或环境变量的配置加载。
您可以使用多种格式(.json、.js、yaml 等)指定您的配置。使用默认设置,您需要在您的应用中创建一个 config
文件夹root 和 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);
好吧,我试过一些不同的方法来处理这个问题。
对于我的特定用例,我找到的最佳选择是 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
的这个实例将使用我的测试配置。
这不适用于端到端测试,除非您导入配置的唯一位置是主应用程序文件。
Jest 对这种情况有很好的支持。在您的测试文件中,添加
jest.mock('../config.js', () => ({
credentials: {
secret: 'my_secret'
}
// other fake config stuff }));
我有一个刚开始使用的 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);
});
});
此规范将失败,因为应用程序将使用配置文件中的密码(空字符串)而不是我的测试密码。
我将 node-config 用于我的配置文件和基于机器或环境变量的配置加载。
您可以使用多种格式(.json、.js、yaml 等)指定您的配置。使用默认设置,您需要在您的应用中创建一个 config
文件夹root 和 default.<format>
使用您的默认配置。
要覆盖它以进行测试,您可以在 config
目录中创建一个 test.<format>
文件。当您设置 NODE_ENV=test
时,node-config
将看到加载您的默认配置文件,然后它将加载您的测试配置文件,如果值有任何冲突,您的测试配置文件将覆盖这些值在您的默认文件中。
这是在 node-config
下面是使用 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);
好吧,我试过一些不同的方法来处理这个问题。
对于我的特定用例,我找到的最佳选择是 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
的这个实例将使用我的测试配置。
这不适用于端到端测试,除非您导入配置的唯一位置是主应用程序文件。
Jest 对这种情况有很好的支持。在您的测试文件中,添加
jest.mock('../config.js', () => ({
credentials: {
secret: 'my_secret'
}
// other fake config stuff }));