[英]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=test
, node-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.