web-dev-qa-db-ja.com

node.jsでprocess.envをスタブする方法は?

スタブしたいprocess.env.FOO with bar

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

よくわかりません。ドキュメントを読みましたが、まだ理解できません。 sinonjs docs

sinonjsは1つの例であり、sinonjsは大丈夫ではありません。

60
Matt - sanemat

process.envの私の理解から、そのプロパティを設定するときに、他の変数と同じように扱うことができます。ただし、process.envのすべての値は文字列でなければならないことに注意してください。したがって、テストで特定の値が必要な場合:

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

状態が他のテストに漏れないようにするには、変数を必ず元の値にリセットするか、完全に削除してください。

   afterEach(() => {
       delete process.env.NODE_ENV;
   });
57
Joshua Dutton

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 ...
}
23
pllee

spec-helper.coffeeまたはsinonサンドボックスを設定した同様の場所で、元の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'
4
Andrew Homeyer

Sinonを使用すると、このような変数をスタブ化できます。

 const myObj = {
    example: 'oldValue', 
 };

 sinon.stub(myObj, 'example').value('newValue');

 myObj.example; // 'newValue'

この例は、フォームsinonのドキュメントです。 https://sinonjs.org/releases/v6.1.5/stubs/


その知識があれば、あらゆる環境変数をスタブ化できます。あなたの場合、次のようになります。

 let stub = sinon.stub(process.env, 'FOO').value('bar');
0
Getriax