web-dev-qa-db-fra.com

Comment stub process.env dans node.js?

Je veux stub process.env.FOO avec bar.

var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');

Je suis confus ... Je lis le document, mais je ne comprends toujours pas. sinonjs docs

sinonjs est un exemple, pas sinonjs va bien.

51
Matt - sanemat

D'après ma compréhension de process.env, vous pouvez simplement le traiter comme n'importe quelle autre variable lors de la définition de ses propriétés. Gardez toutefois à l'esprit que chaque valeur dans process.env doit être une chaîne. Donc, si vous avez besoin d’une valeur particulière dans votre test:

   it('does something interesting', () => {
      process.env.NODE_ENV = 'test';
      // ...
   });

Pour éviter toute fuite d’état dans d’autres tests, veillez à rétablir la valeur initiale de la variable ou à la supprimer:

   afterEach(() => {
       delete process.env.NODE_ENV;
   });
48
Joshua Dutton

J'ai pu obtenir que process.env soit correctement stubé dans mes tests unitaires en le clonant et en le restaurant par une méthode de démontage. 

Exemple d'utilisation de moka

const env = Object.assign({}, process.env);

after(() => {
    process.env = env;
});

...

it('my test', ()=> {
    process.env.NODE_ENV = 'blah'
})

Gardez à l'esprit que cela ne fonctionnera que si le fichier process.env est uniquement lu dans la fonction que vous testez. Par exemple, si le code que vous testez lit la variable et l'utilise dans une fermeture, cela ne fonctionnera pas. Vous invalidez probablement l'exigence mise en cache pour tester cela correctement.

Par exemple, les envois suivants ne seront pas stubbed:

const nodeEnv = process.env.NODE_ENV;

const fnToTest = () => {
   nodeEnv ...
}
20
pllee

Dans un spec-helper.coffee ou quelque chose de similaire où vous avez configuré votre sandbox sinon, gardez une trace du process.env d'origine et restaurez-le après chaque test afin d'éviter toute fuite entre les tests et de ne pas vous rappeler de réinitialiser à chaque fois.

_ = require 'lodash'
sinon = require 'sinon'

beforeEach ->
    @originalProcessEnv = _.cloneDeep process.env

afterEach ->
    process.env = _.cloneDeep @originalProcessEnv

Dans votre test, utilisez process.env comme d'habitude.

it 'does something based on an env var', ->
    process.env.FOO = 'bar'
4
Andrew Homeyer

Sinon, vous pouvez écraser n'importe quelle variable comme celle-ci.

 var myObj = {
    example: 'oldValue', 
 };

 sinon.stub(myObj, 'example').value('newValue');

 myObj.example; // 'newValue'

Cet exemple est formulaire sinon documentation. https://sinonjs.org/releases/v6.1.5/stubs/


Avec cette connaissance, vous pouvez remplacer n'importe quelle variable d'environnement . Dans votre cas, cela ressemblerait à ceci:

 ar stub = sinon.stub(process.env, 'FOO').value('bar');
0
Getriax