2014-07-05 14 views
39

Chcę użyć kodu pośredniczącego process.env.FOO z bar.Jak do stub process.env w pliku node.js?

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

Jestem zdezorientowany. Czytam dokument, ale nadal nie rozumiem. sinonjs docs

sinonjs jest jednym z przykładów, nie sinonjs jest w porządku.

+0

Czy możesz wyjaśnić, dlaczego chcesz skrótową środowisko vars? Czy robisz to na podobnym do systemu operacyjnego lub systemu Windows? – slebetman

+1

@slebetman często można polegać na zmiennych środowiskowych do konfiguracji, takich jak klucz API dla usługi, na której polegasz. Zobacz http://12factor.net/. –

+1

@AndrewHomeyer: Tak, ale Ty nie ** ich ** - ustawiłeś poprawnie dla testu – slebetman

Odpowiedz

32

Z mojego rozumienia process.env można po prostu traktować ją jak każdą inną zmienną podczas ustawiania jej właściwości. Pamiętaj jednak, że każda wartość w process.env musi być łańcuchem. Tak więc, jeśli trzeba szczególną wartość w swojej Test:

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

Aby zapobiec wyciekaniu stanu w innych badaniach, należy zresetować zmienną do jego pierwotnej wartości lub usunąć go całkowicie:

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

Czy to działało dla każdego? – Andrei

+5

To nie działa dla mnie – androidtitan

+3

To działa dla mnie. Należy pamiętać o tym, że jeśli testujesz moduł, który odczytuje NODE_ENV, kiedy moduł ładuje się po raz pierwszy, prawdopodobnie będziesz chciał ustawić NODE_ENV _ przed rozpoczęciem ładowania modułu (np. NODE_ENV można ustawić w bloku beforeEach). To może wydaje się oczywiste, ale wcześniej mnie potknął. – Terrence

2

W a spec-helper.coffee lub coś podobnego, gdy konfigurujesz piaskownicę sinon, śledź oryginalną wersję process.env i przywracaj ją po każdym teście, aby nie przeciekać między testami i nie musisz pamiętać, aby resetować za każdym razem.

W teście używaj normalnie process.env.

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

udało mi się dostać process.env być odpowiednio stubed w moich testów jednostkowych przez klonowanie go iw sposób teardown przywrócenie go.

przykład stosując Mocha

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

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

... 

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

Pamiętaj, to będzie działać tylko wtedy, gdy process.env jest tylko odczytywane w funkcji testowanej. Na przykład, jeśli testowany kod odczytuje zmienną i używa jej w zamknięciu, to nie zadziała. Prawdopodobnie unieważniasz buforowane wymagania, aby poprawnie to przetestować.

Na przykład dodaje nie będzie miał env zgaszone:

const nodeEnv = process.env.NODE_ENV; 

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

Ten proces w większości działał. Musiałem zmodyfikować metodę "po". 'after (() => { process.env = Object.assign ({}, env); });' W przeciwnym razie testy będą manipulować wspólną kopią. Musisz ustawić po każdym teście nową wersję. – Kyle

Powiązane problemy