2014-07-05 10 views
39

मैं process.env.FOObar के साथ स्टब करना चाहता हूं।node.js में process.env को कैसे दबाएं?

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

मैं उलझन में हूँ। मैंने दस्तावेज़ पढ़ा, लेकिन फिर भी मुझे अभी तक समझ में नहीं आया है। sinonjs docs

साइनोनज एक उदाहरण है, साइनऑन ठीक नहीं है।

+0

आप व्याख्या कर सकते हैं क्यों आप पर्यावरण वार्स ठूंठ चाहेगा? क्या आप इसे यूनिक्स जैसी ओएस या विंडोज पर कर रहे हैं? – slebetman

+1

@ स्लेबेटमैन कॉन्फ़िगरेशन के लिए पर्यावरण चर पर भरोसा करना आम है, जैसे कि आप जिस सेवा पर भरोसा करते हैं उसके लिए एक एपीआई कुंजी। Http://12factor.net/ देखें। –

+1

@AndrewHomeyer: हाँ, लेकिन आप ** ** उन्हें ** स्टब नहीं करते हैं - आप परीक्षण – slebetman

उत्तर

32

process.env की मेरी समझ से, आप इसकी संपत्तियों को सेट करते समय इसे किसी अन्य चर की तरह ही इलाज कर सकते हैं। ध्यान रखें, हालांकि, process.env में प्रत्येक मान एक स्ट्रिंग होना चाहिए। तो, अगर आप अपने परीक्षण में एक विशेष मूल्य की जरूरत है:

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

के लिए उन्हें सही ढंग से सेट करते हैं क्या यह किसी के लिए काम करता है? – Andrei

+5

यह मेरे लिए काम नहीं कर रहा है – androidtitan

+3

यह मेरे लिए काम करता है। ध्यान में रखना एक बात यह है कि यदि आप मॉड्यूल का परीक्षण कर रहे हैं जो मॉड्यूल पहले लोड होने पर NODE_ENV पढ़ता है, तो आप शायद मॉड्यूल लोड करने के लिए NODE_ENV _before_ सेट करना चाहते हैं (यानी NODE_ENV पहले से प्रत्येक ब्लॉक में सेट किया जा सकता है।) यह हो सकता है प्रतीत होता है, लेकिन यह मुझे पहले से छीन लिया है। – Terrence

2

में:

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

अन्य परीक्षणों में राज्य लीक से बचने के लिए अपने मूल मूल्य के लिए चर रीसेट या इसे पूरी तरह से हटाने के लिए सुनिश्चित हो spec-helper.coffee या कुछ ऐसा ही है जहां आपने अपना साइनऑन सैंडबॉक्स सेट किया है, मूल process.env का ट्रैक रखें और प्रत्येक परीक्षण के बाद इसे पुनर्स्थापित करें, इसलिए आप परीक्षणों के बीच रिसाव नहीं करते हैं और हर बार रीसेट करने की याद नहीं रखते हैं।

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

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

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

अपने परीक्षण में, process.env सामान्य के रूप में उपयोग करें।

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

मैं इसे क्लोनिंग द्वारा और एक टियरडाउन विधि यह बहाल करने में मेरी इकाई परीक्षण में ठीक से stubed किए जाने की process.env प्राप्त करने में सक्षम था।

उदाहरण मोचा

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

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

... 

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

का उपयोग कर ध्यान रखें कि यह केवल तभी process.env केवल समारोह परीक्षण किए जाने में पढ़ा जा रहा है काम करेंगे। उदाहरण के लिए यदि आप जिस कोड का परीक्षण कर रहे हैं वह चर को पढ़ता है और इसे बंद करने में उपयोग करता है तो यह काम नहीं करेगा। आप शायद उस जांच के लिए कैश की आवश्यकता को अमान्य कर दें।

उदाहरण के लिए निम्नलिखित env नहीं होगा टोंटदार:

const nodeEnv = process.env.NODE_ENV; 

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

यह प्रक्रिया ज्यादातर काम करती है। मुझे "बाद" विधि को ट्विक करना पड़ा। 'के बाद (() => { process.env = Object.assign ({}, env); }); ' अन्यथा परीक्षण साझा प्रति में हेरफेर करेंगे। प्रत्येक परीक्षण के बाद एक ताजा संस्करण सेट करने की आवश्यकता है। – Kyle

संबंधित मुद्दे