Quiero tropezar process.env.FOOcon 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.envtenga 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 --watchlas 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.envsu 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ándomeundefinederrores donde estaba haciendo el.toLowerCase()Pude conseguir
process.envque 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.coffeeo algo similar en el que configuras tu caja de arena de Sinon, haz un seguimiento del originalprocess.envy 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 @originalProcessEnvEn su prueba, utilícelo
process.envnormalmente.it 'does something based on an env var', -> process.env.FOO = 'bar'fuente
underscoreLaclonefunción de funciona en lugar decloneDeep: útil si ya está usando enunderscorelugar 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.USERaún no tenga un valor.