2014-04-09 6 views
1

config/index.js은 설정 한 NODE_ENV 환경 변수를 기반으로 다른 구성 파일을 반환합니다.모카 테스트에서 같은 파일을 요구하는 방법

올바른 환경 설정이 각 환경에 반환되도록 간단한 테스트를 작성하려고하지만 첫 번째 요구 사항 만 실제로 호출되고 이후 동일한 파일 요구 사항이있는 문제가 발생합니다. 첫 번째 값에서 값을 사용합니다.

이 문제를 해결하기 위해 테스트를 어떻게 변경해야합니까? 나는 2를 실행하기 전에 노드의 모듈 캐시에서 모듈을 제거 할

var Hoek = require('hoek'); 

var settings = { 
    'defaults':  require('./settings/defaults'), 
    'production': require('./settings/production') 
}; 

var env; 
switch (process.env.NODE_ENV) { 
    case 'production': env = 'production'; break; 
    case 'development': env = 'development'; break; 
    default:   env = 'defaults';  break; 
} 

var config = Hoek.applyToDefaults(settings['defaults'], settings[env]); 
module.exports = config; 

답변

5

:

describe('config', function() { 

    it('should return dev config', function (done) { 
    process.env.NODE_ENV = 'development'; 
    var config = require(__dirname + '/../../config'); // development config 

    console.log(config.plugins.ipFilter); 
    done(); 
    }); 

    it('should return prod config', function (done) { 
    process.env.NODE_ENV = 'production'; 

    // development config from above. 
    // the require here doesn't actually get invoked 
    var config = require(__dirname + '/../../config'); 

    console.log(config.plugins.ipFilter); 
    done(); 
    }); 
}); 

그리고 여기에 내가 시험에 노력하고 있음을, (잘 작동) config/index.js의 단순화 된 버전입니다 테스트 :

var resolved = require.resolve(__dirname + '/../../config'); 
delete require.cache[resolved]; 

그래서 다시 요구할 때 노드는 처음부터로드합니다. 위의 코드는 캐시에서 config 모듈 만 삭제합니다. require에 의해로드 된 모듈을 모듈 config 모듈 내부로 삭제해야하는 경우 각 모듈에 대해 위와 동일한 조치를 취해야합니다.

그런데 테스트가 비동기식으로 진행될 경우 현재있는 것처럼 done 콜백이 필요합니다. 현재 테스트가 동기 상태로 유지되는 경우 it에 지정된 콜백 인수 목록에서 done을 제거하고 호출을 생략 할 수 있습니다.

+0

require.resolve는 파일의 경로를 제공합니다. 경로별로 캐시를 삭제하기 전에 여전히 (해결 된) 것을 요구해야합니다. 미래의 독자를 위해 추가 할 것을 제안합니다. 당신의 도움을 주셔서 감사합니다. – doremi

관련 문제