나는 스텁 할 process.env.FOO
함께 bar
.
var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');
혼란 스럽습니다. 문서를 읽었지만 아직 이해가되지 않습니다. sinonjs 문서
sinonjs는 하나의 예이며 sinonjs는 괜찮습니다.
나는 스텁 할 process.env.FOO
함께 bar
.
var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');
혼란 스럽습니다. 문서를 읽었지만 아직 이해가되지 않습니다. sinonjs 문서
sinonjs는 하나의 예이며 sinonjs는 괜찮습니다.
답변:
에 대한 내 이해에서 process.env
속성을 설정할 때 다른 변수처럼 간단히 처리 할 수 있습니다. 하지만의 모든 값 process.env
은 문자열이어야합니다. 따라서 테스트에서 특정 값이 필요한 경우 :
it('does something interesting', () => {
process.env.NODE_ENV = 'test';
// ...
});
상태가 다른 테스트로 누출되지 않도록하려면 변수를 원래 값으로 재설정하거나 모두 삭제해야합니다.
afterEach(() => {
delete process.env.NODE_ENV;
});
jest
. 내 프로덕션 코드에서 env에서 const (예 :)로 할당했습니다 const X = process.env.X
. const는 함수 범위가 아닌 (ES) 모듈 범위에서 선언되었습니다. 내 테스트는 항상 jest --watch
재 시도 된 테스트 실행에서 통과 했지만 항상 첫 번째 실행에서는 실패했습니다. 여기서 완전히 이해하지 못하는 주문 문제가 있습니다. 항상 process.env
프로덕션 코드 (즉, 함수)에서 직접 읽고 있고 모듈 수준에서 캐싱하지 않는지 확인하십시오.
const myValue = process.env.value ? process.env.value : 'default'
테스트 내에서 process.env.value를 설정하면 작동하지 않았습니다. 그러나 const myValue = () => (process.env.value ? process.env.value : 'default'
)는 예상대로 작동합니다!
const SWITCH_ON = (process.env.SWITCH_ON.toLowerCase() === 'true');
작동하지 않아서 두 줄로 변경했습니다 var switchOn = process.env.SWITCH_ON; const SWITCH_ON = (switchOn === undefined ? false : switchOn.toLowerCase() === 'true');
. 이니셜은 undefined
제가하고 있던 곳에서 계속 오류를 발생 시켰 습니다.toLowerCase()
나는 process.env
그것을 복제하고 그것을 복원하는 분해 방법으로 내 단위 테스트에서 적절하게 stubed 될 수있었습니다 .
Mocha를 사용한 예
const env = Object.assign({}, process.env);
after(() => {
process.env = env;
});
...
it('my test', ()=> {
process.env.NODE_ENV = 'blah'
})
이것은 process.env가 테스트중인 함수에서만 읽는 경우에만 작동합니다. 예를 들어 테스트중인 코드가 변수를 읽고 클로저에서 사용하면 작동하지 않습니다. 제대로 테스트하기 위해 캐시 된 요구 사항을 무효화 할 수 있습니다.
예를 들어 다음은 env가 스텁되지 않습니다.
const nodeEnv = process.env.NODE_ENV;
const fnToTest = () => {
nodeEnv ...
}
after(() => { process.env = Object.assign({}, env); });
그렇지 않으면 테스트가 공유 사본을 조작합니다. 각 테스트 후 새로운 버전을 설정해야합니다.
A의 spec-helper.coffee
당신이 당신의 sinon 샌드 박스를 설정하는 곳이나 뭐 비슷한, 원래의 추적 process.env
당신이 검사 사이에 누설하지 않는 모든 시간을 다시 기억하지 않아도, 각 시험 후 복원합니다.
_ = require 'lodash'
sinon = require 'sinon'
beforeEach ->
@originalProcessEnv = _.cloneDeep process.env
afterEach ->
process.env = _.cloneDeep @originalProcessEnv
테스트에서 process.env
정상적으로 사용하십시오 .
it 'does something based on an env var', ->
process.env.FOO = 'bar'
underscore
의 clone
기능을 대신 작동 cloneDeep
이미 사용하는 경우 유용합니다 - underscore
보다는 lodash
.
sinon을 사용하면 이와 같은 변수를 스텁 할 수 있습니다.
const myObj = {
example: 'oldValue',
};
sinon.stub(myObj, 'example').value('newValue');
myObj.example; // 'newValue'
이 예제는 sinon 문서 양식입니다. https://sinonjs.org/releases/v6.1.5/stubs/
이러한 지식으로 모든 환경 변수를 스텁 할 수 있습니다. 귀하의 경우에는 다음과 같이 보일 것입니다.
let stub = sinon.stub(process.env, 'FOO').value('bar');
require('dotenv').config();
애플리케이션이 실행될 때 일반적으로 호출된다는 것을 깨달았지만 단위 테스트를 직접 실행하는 경우 require 문이 누락되었습니다.
단위 테스트 중에 process.env를 빠르게 모의하는 방법.
https://glebbahmutov.com/blog/mocking-process-env/
const sinon = require('sinon')
let sandbox = sinon.createSandbox()
beforeEach(() => {
sandbox.stub(process.env, 'USER').value('test-user')
})
it('has expected user', () => {
assert(process.env.USER === 'test-user', 'wrong user')
})
afterEach(() => {
sandbox.restore()
})
그러나 테스트 전에 process.env에 존재하지 않을 수있는 속성은 어떻습니까? 다음 패키지를 사용하면 존재하지 않는 환경 변수를 테스트 할 수 있습니다.
process.env.USER
아직 값 이 없으면 작동 하지 않습니다.
process.env에없는 키를 스텁하려면 이것을 사용할 수 있습니다.
const sinon = require('sinon')
let sandbox = sinon.createSandbox();
sandbox.stub(process, 'env').value({ 'SOME_KEY': 'SOME_VALUE' });