2014-07-05 28 views
39

Ich möchte stub process.env.FOO mit bar.Wie stub process.env in node.js?

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

Ich bin verwirrt. Ich lese Dokument, aber immer noch verstehe ich noch nicht. sinonjs docs

sinonjs ist ein Beispiel, nicht sinonjs ist in Ordnung.

+0

Können Sie erklären, warum Sie Umgebung wollen würde Stummel Vars? Machst du das auf einem Unix-ähnlichen Betriebssystem oder Windows? – slebetman

+1

@slebetman Es ist üblich, sich bei der Konfiguration auf Umgebungsvariablen zu verlassen, z. B. einen API-Schlüssel für einen Dienst, auf den Sie angewiesen sind. Siehe http://12factor.net/. –

+1

@AndrewHomeyer: Ja, aber Sie ** stub ** sie nicht - Sie setzen sie richtig für den Test – slebetman

Antwort

32

Von meinem Verständnis von process.env können Sie es einfach wie jede andere Variable behandeln, wenn Sie seine Eigenschaften festlegen. Beachten Sie jedoch, dass jeder Wert in process.env eine Zeichenfolge sein muss. Also, wenn Sie einen bestimmten Wert im Test benötigen:

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

zu vermeiden Um Zustand in anderen Tests undicht, müssen Sie die Variable auf den ursprünglichen Wert zurückgesetzt werden oder ganz löschen:

afterEach(() => { 
     delete process.env.NODE_ENV; 
    }); 
+1

Hat dies für jedermann funktioniert? – Andrei

+5

Es funktioniert nicht für mich – androidtitan

+3

Es funktioniert für mich. Beachten Sie Folgendes: Wenn Sie ein Modul testen, das NODE_ENV liest, wenn das Modul zum ersten Mal geladen wird, sollten Sie NODE_ENV _bevor_ das Modul laden (dh NODE_ENV kann in einem beforeEach-Block gesetzt werden). Dies kann Scheint offensichtlich, aber es hat mich schon einmal gestolpert. – Terrence

2

In a spec-helper.coffee oder etwas Ähnliches, wo Sie Ihre Sinon Sandbox einrichten, verfolgen Sie das Original process.env und stellen Sie es nach jedem Test wieder her, damit Sie zwischen den Tests nicht leckt und nicht jedes Mal daran denken müssen, neu zu setzen.

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

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

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

In Ihrem Test verwenden process.env als normal.

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

konnte ich process.env erhalten, indem das Klonen es richtig in meinen Unit-Tests werden stubed und in einem Teardown-Verfahren sie wiederherzustellen.

Beispiel Mokka mit

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

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

... 

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

Denken Sie daran, ist dies nur funktioniert, wenn die process.env nur gelesen wird Ihnen in der Funktion testen. Wenn beispielsweise der Code, den Sie testen, die Variable liest und in einem Closure verwendet, funktioniert sie nicht. Wahrscheinlich haben Sie die zwischengespeicherte Anforderung für ungültig erklärt, um dies richtig zu testen.

zum Beispiel die folgenden nicht die env stubbed:

const nodeEnv = process.env.NODE_ENV; 

const fnToTest =() => { 
    nodeEnv ... 
} 
+2

Dieser Prozess funktionierte größtenteils. Ich musste die "Nachher" -Methode optimieren. 'nach (() => { process.env = Object.assign ({}, env); });' Andernfalls würden die Tests die gemeinsame Kopie manipulieren. Muss nach jedem Test eine neue Version einstellen. – Kyle