Ich möchte Stummel process.env.FOO
mit bar
.
var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');
Ich bin verwirrt. Ich lese das Dokument, verstehe es aber noch nicht. sinonjs docs
sinonjs ist ein Beispiel, nicht sinonjs ist in Ordnung.
Antworten:
Nach meinem Verständnis
process.env
können Sie es beim Festlegen seiner Eigenschaften einfach wie jede andere Variable behandeln. Beachten Sie jedoch, dass jeder Wert inprocess.env
eine Zeichenfolge sein muss. Wenn Sie also einen bestimmten Wert in Ihrem Test benötigen:it('does something interesting', () => { process.env.NODE_ENV = 'test'; // ... });
Stellen Sie sicher, dass Sie die Variable auf ihren ursprünglichen Wert zurücksetzen oder ganz löschen, um zu vermeiden, dass der Status in andere Tests verloren geht:
afterEach(() => { delete process.env.NODE_ENV; });
quelle
jest
. In meinem Produktionscode habe ich von env einer const zugewiesen (zBconst X = process.env.X
). Die const wurde im (ES) Modulbereich deklariert, nicht im Funktionsbereich. Meine Tests haben beijest --watch
wiederholten Testläufen immer bestanden , sind aber beim ersten Lauf immer fehlgeschlagen. Es gibt ein Bestellproblem, das ich hier nicht vollständig verstehe. Stellen Sie einfach sicher, dass Sie immer direkt ausprocess.env
Ihrem Produktionscode (dh in einer Funktion) lesen und ihn nicht auf Modulebene zwischenspeichern.const myValue = process.env.value ? process.env.value : 'default'
würde ich nicht funktionieren, wenn Sie process.env.value innerhalb eines Tests festlegen. Funktioniert jedochconst myValue = () => (process.env.value ? process.env.value : 'default'
wie erwartet!const SWITCH_ON = (process.env.SWITCH_ON.toLowerCase() === 'true');
was nicht funktionierte, also änderte ich es in zwei Zeilen:var switchOn = process.env.SWITCH_ON; const SWITCH_ON = (switchOn === undefined ? false : switchOn.toLowerCase() === 'true');
Die Initiale gab mir immer wiederundefined
Fehler, wo ich die.toLowerCase()
Ich konnte
process.env
in meinen Unit-Tests richtig geklubbt werden, indem ich es klonte und in einer Teardown-Methode wiederherstellte.Beispiel mit Mokka
const env = Object.assign({}, process.env); after(() => { process.env = env; }); ... it('my test', ()=> { process.env.NODE_ENV = 'blah' })
Beachten Sie, dass dies nur funktioniert, wenn process.env nur in der von Ihnen getesteten Funktion gelesen wird. Wenn der zu testende Code beispielsweise die Variable liest und in einem Abschluss verwendet, funktioniert dies nicht. Sie machen wahrscheinlich die zwischengespeicherte Anforderung ungültig, um dies ordnungsgemäß zu testen.
Zum Beispiel wird die Umgebung nicht wie folgt blockiert:
const nodeEnv = process.env.NODE_ENV; const fnToTest = () => { nodeEnv ... }
quelle
after(() => { process.env = Object.assign({}, env); });
Andernfalls würden die Tests die freigegebene Kopie manipulieren. Müssen Sie nach jedem Test eine neue Version einstellen.spec-helper.coffee
Behalten Sie in einem oder einem ähnlichen Bereich, in dem Sie Ihre Sinon-Sandbox eingerichtet haben, den Überblick über das Originalprocess.env
und stellen Sie es nach jedem Test wieder her, damit Sie nicht zwischen den Tests auslaufen und nicht jedes Mal daran denken müssen, es zurückzusetzen._ = require 'lodash' sinon = require 'sinon' beforeEach -> @originalProcessEnv = _.cloneDeep process.env afterEach -> process.env = _.cloneDeep @originalProcessEnv
Verwenden Sie in Ihrem Test
process.env
wie gewohnt.it 'does something based on an env var', -> process.env.FOO = 'bar'
quelle
underscore
Dieclone
Funktion von funktioniert anstelle voncloneDeep
- nützlich, wenn Sie bereitsunderscore
anstatt verwendenlodash
.Mit sinon können Sie jede Variable wie diese stubben.
const myObj = { example: 'oldValue', }; sinon.stub(myObj, 'example').value('newValue'); myObj.example; // 'newValue'
Dieses Beispiel ist eine Sinon-Dokumentation. https://sinonjs.org/releases/v6.1.5/stubs/
Mit diesem Wissen können Sie jede Umgebungsvariable stubben. In Ihrem Fall würde es so aussehen:
let stub = sinon.stub(process.env, 'FOO').value('bar');
quelle
require('dotenv').config();
Ich habe festgestellt, dass dies normalerweise aufgerufen wird, wenn meine Anwendung ausgeführt wird, aber wenn ich meine Unit-Tests direkt ausführe, dies require-Anweisung würde fehlen.Wie man process.env während des Unit-Tests schnell verspottet.
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() })
Aber was ist mit Eigenschaften, die vor dem Test möglicherweise nicht in process.env vorhanden sind? Sie können das folgende Paket verwenden und dann die nicht vorhandenen env-Variablen testen.
https://github.com/bahmutov/mocked-env
quelle
process.env.USER
noch kein Wert vorhanden ist.