sinonで環境変数をstubする

JavaScript
  • ターゲット:Node.jsで環境変数に依存するモジュールをテストする
  • ゴール:環境変数をテスト内で有効化、無効化、値の変更を行う
  • 前提
    • mocha: ^5.2.0
    • sinon: ^7.2.7

早速進めていきましょうー

重要ポイント

環境変数をstubする為に、気をつけることがあります。
それは、「存在しない環境変数はstubできない」という事。

知らないと地味にハマるので気を付けてください。

落とし穴対策

こういう地味な落とし穴にかからないように、beforeEachとかで事前に設定すると良いです。

var sinon = require('sinon');
describe('sampleTest', function () {

  var sandbox;

  beforeEach(function (done) {
    process.env.TEST_ENV = '';
    sandbox = sinon.createSandbox();
    done();
  });

  ...
}

こんな感じ

TEST_ENV という環境変数を空文字で設定しています。これを各テストケースの中で設定するイメージです。

きちんと解放しようね

次に、環境変数をstubしたら、その結果をクリアしないといけません。
設定値が残り続けていると、他のテストに影響してしまうからです。なので、

...(略)

  afterEach(function (done) {
    sandbox.restore();
    done();
  });

...

という具合にしておきます。

本題のstub

お待たせしました。実際にstubしましょ。

... (略)

  it('環境変数 TEST_ENV に hello を設定', done => {
    sandbox.stub(process.env, 'TEST_ENV').value('hello');
    console.log(process.env.TEST_ENV);
    done();
  });

...

これだけです。簡単!

ちなみに、process.envの削除は delete process.env.TEST_ENV; でできます。

最終形

var sinon = require('sinon');
describe('sampleTest', function () {

  var sandbox;

  beforeEach(function (done) {
    process.env.TEST_ENV = '';
    sandbox = sinon.createSandbox();
    done();
  });

  afterEach(function (done) {
    sandbox.restore();
    done();
  });

  it('環境変数 TEST_ENV に hello を設定', done => {
    sandbox.stub(process.env, 'TEST_ENV').value('hello');
    console.log(process.env.TEST_ENV);
    done();
  });
});

ではでは