Quiero tropezar process.env.FOO
con bar
.
var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');
Estoy confundido. Leí el documento, pero todavía no lo entiendo. sinonjs docs
sinonjs es un ejemplo, no sinonjs está bien.
Respuestas:
Según tengo entendido
process.env
, simplemente puede tratarlo como cualquier otra variable al establecer sus propiedades. Sin embargo,process.env
tenga en cuenta que cada valor debe ser una cadena. Entonces, si necesita un valor particular en su prueba:it('does something interesting', () => { process.env.NODE_ENV = 'test'; // ... });
Para evitar filtrar el estado en otras pruebas, asegúrese de restablecer la variable a su valor original o elimínela por completo:
afterEach(() => { delete process.env.NODE_ENV; });
fuente
jest
. En mi código de producción asigné de env a una constante (por ejemploconst X = process.env.X
). La const se declaró en el ámbito del módulo (ES), no en el ámbito de la función. Mis pruebas siempre pasaban conjest --watch
las ejecuciones de prueba reintentadas, pero siempre fallaban en la primera ejecución. Hay un problema de pedido que no entiendo completamente aquí. Solo asegúrese de estar siempre leyendo directamente desdeprocess.env
su código de producción (es decir, en una función), y no almacenando en caché a nivel de módulo.const myValue = process.env.value ? process.env.value : 'default'
no funcionaría si configurara process.env.value dentro de una prueba. Sin embargo,const myValue = () => (process.env.value ? process.env.value : 'default'
) funciona como se esperaba.const SWITCH_ON = (process.env.SWITCH_ON.toLowerCase() === 'true');
que no funcionó, así que lo cambié a dos líneas:var switchOn = process.env.SWITCH_ON; const SWITCH_ON = (switchOn === undefined ? false : switchOn.toLowerCase() === 'true');
La inicial seguía dándomeundefined
errores donde estaba haciendo el.toLowerCase()
Pude conseguir
process.env
que me aprueben correctamente en mis pruebas unitarias clonándolo y en un método de desmontaje restaurándolo.Ejemplo usando Mocha
const env = Object.assign({}, process.env); after(() => { process.env = env; }); ... it('my test', ()=> { process.env.NODE_ENV = 'blah' })
Tenga en cuenta que esto solo funcionará si process.env solo se lee en la función que está probando. Por ejemplo, si el código que está probando lee la variable y la usa en un cierre, no funcionará. Probablemente invalide el requisito almacenado en caché para probarlo correctamente.
Por ejemplo, lo siguiente no tendrá el env codificado:
const nodeEnv = process.env.NODE_ENV; const fnToTest = () => { nodeEnv ... }
fuente
after(() => { process.env = Object.assign({}, env); });
De lo contrario, las pruebas manipularían la copia compartida. Es necesario configurar después de cada prueba una versión nueva.En uno
spec-helper.coffee
o algo similar en el que configuras tu caja de arena de Sinon, haz un seguimiento del originalprocess.env
y restáuralo después de cada prueba, para que no tengas fugas entre las pruebas y no tengas que acordarte de reiniciar cada vez._ = require 'lodash' sinon = require 'sinon' beforeEach -> @originalProcessEnv = _.cloneDeep process.env afterEach -> process.env = _.cloneDeep @originalProcessEnv
En su prueba, utilícelo
process.env
normalmente.it 'does something based on an env var', -> process.env.FOO = 'bar'
fuente
underscore
Laclone
función de funciona en lugar decloneDeep
: útil si ya está usando enunderscore
lugar delodash
.Con sinon puede stub cualquier variable como esta.
const myObj = { example: 'oldValue', }; sinon.stub(myObj, 'example').value('newValue'); myObj.example; // 'newValue'
Este ejemplo es documentación de formulario sinon. https://sinonjs.org/releases/v6.1.5/stubs/
Con ese conocimiento, puede apuntar cualquier variable de entorno. En su caso, se vería así:
let stub = sinon.stub(process.env, 'FOO').value('bar');
fuente
require('dotenv').config();
me di cuenta de que normalmente se llama a esto cuando se ejecuta mi aplicación, pero si estoy ejecutando mis pruebas de unidad directamente, esto Requerir declaración faltaría.Cómo simular rápidamente process.env durante las pruebas unitarias.
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() })
Pero, ¿qué pasa con las propiedades que podrían no existir en process.env antes de la prueba? Puede usar el siguiente paquete y luego podrá probar las variables env no existentes.
https://github.com/bahmutov/mocked-env
fuente
process.env.USER
aún no tenga un valor.