Chcę się process.env.FOO
z tym pogodzić bar
.
var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');
Jestem zmieszany. Przeczytałem dokument, ale nadal nie rozumiem. sinonjs docs
sinonjs jest jednym z przykładów, nie sinonjs jest w porządku.
Odpowiedzi:
Z mojego zrozumienia
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ść wprocess.env
musi być ciągiem. Jeśli więc potrzebujesz określonej wartości w swoim teście:it('does something interesting', () => { process.env.NODE_ENV = 'test'; // ... });
Aby uniknąć wycieku stanu do innych testów, należy zresetować zmienną do jej pierwotnej wartości lub całkowicie ją usunąć:
afterEach(() => { delete process.env.NODE_ENV; });
źródło
jest
. W moim kodzie produkcyjnym przypisałem z env do const (npconst X = process.env.X
.). Stała została zadeklarowana w zakresie modułu (ES), a nie w zakresie funkcji. Moje testy zawszejest --watch
kończyły się pomyślnie przy ponownym uruchomieniu testów, ale zawsze kończyły się niepowodzeniem przy pierwszym uruchomieniu. Występuje problem z zamówieniem, którego nie do końca rozumiem. Po prostu upewnij się, że zawsze czytasz bezpośrednio zprocess.env
kodu produkcyjnego (tj. W funkcji) i nie przechowujesz go w pamięci podręcznej na poziomie modułu.const myValue = process.env.value ? process.env.value : 'default'
nie działałoby, jeśli ustawisz wartość process.env.value w teście. Jednakconst myValue = () => (process.env.value ? process.env.value : 'default'
) działa zgodnie z oczekiwaniami!const SWITCH_ON = (process.env.SWITCH_ON.toLowerCase() === 'true');
co nie zadziałało, więc zmieniłem to na dwie linie:var switchOn = process.env.SWITCH_ON; const SWITCH_ON = (switchOn === undefined ? false : switchOn.toLowerCase() === 'true');
Początek ciągle dawał miundefined
błędy w miejscu, w którym robiłem.toLowerCase()
Udało mi
process.env
się zostać poprawnie usuniętym w moich testach jednostkowych, klonując go i przywracając metodą porzucenia.Przykład z użyciem Mocha
const env = Object.assign({}, process.env); after(() => { process.env = env; }); ... it('my test', ()=> { process.env.NODE_ENV = 'blah' })
Należy pamiętać, że zadziała to tylko wtedy, gdy plik process.env jest odczytywany tylko w testowanej funkcji. Na przykład, jeśli testowany kod odczytuje zmienną i używa jej w zamknięciu, nie zadziała. Prawdopodobnie unieważniłeś buforowane żądanie, aby to poprawnie przetestować.
Na przykład następujące elementy nie będą miały kodu pośredniego env:
const nodeEnv = process.env.NODE_ENV; const fnToTest = () => { nodeEnv ... }
źródło
after(() => { process.env = Object.assign({}, env); });
W przeciwnym razie testy manipulowałyby udostępnioną kopią. Po każdym teście należy ustawić nową wersję.W
spec-helper.coffee
podobnym przypadku, w którym konfigurujesz piaskownicę sinon, śledź oryginałprocess.env
i przywracaj go po każdym teście, aby nie wyciekać między testami i nie musisz pamiętać o resetowaniu za każdym razem._ = require 'lodash' sinon = require 'sinon' beforeEach -> @originalProcessEnv = _.cloneDeep process.env afterEach -> process.env = _.cloneDeep @originalProcessEnv
W swoim teście używaj
process.env
jak zwykle.it 'does something based on an env var', -> process.env.FOO = 'bar'
źródło
underscore
„sclone
funkcja działa w miejscucloneDeep
- przydatna, jeśli używasz jużunderscore
raczej niżlodash
.Za pomocą sinon możesz wyciąć dowolną zmienną taką jak ta.
const myObj = { example: 'oldValue', }; sinon.stub(myObj, 'example').value('newValue'); myObj.example; // 'newValue'
Ten przykład jest dokumentacją w formie sinon. https://sinonjs.org/releases/v6.1.5/stubs/
Mając tę wiedzę, możesz odgiąć dowolną zmienną środowiskową. W twoim przypadku wyglądałoby to tak:
let stub = sinon.stub(process.env, 'FOO').value('bar');
źródło
require('dotenv').config();
zdałem sobie sprawę, że zwykle jest ono wywoływane, gdy moja aplikacja jest uruchomiona, ale jeśli wykonuję testy jednostkowe bezpośrednio, to brakowałoby wymaganego oświadczenia.Jak szybko mockować process.env podczas testów jednostkowych.
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() })
Ale co z właściwościami, które mogą nie istnieć w process.env przed testem? Możesz użyć następującego pakietu, a następnie będziesz mógł przetestować nieistniejące zmienne env.
https://github.com/bahmutov/mocked-env
źródło
process.env.USER
nie ma już wartości.Możesz użyć tego, jeśli chcesz odgiąć klucz, którego nie ma w process.env
const sinon = require('sinon') let sandbox = sinon.createSandbox(); sandbox.stub(process, 'env').value({ 'SOME_KEY': 'SOME_VALUE' });
źródło