2016-02-11 92 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); 
相關問題