是否可以为一个测试设置环境变量?

时间:2016-11-13 21:46:31

标签: javascript node.js mocha

考虑到这样的事情:

it('uses env variables correctly', function(done) {
    assert.equal(process.env.x * process.env.y, 10);
});

我想为这一个测试设置xy环境变量。这可能吗?

2 个答案:

答案 0 :(得分:11)

这是最常见的方法:

describe('env', function () {
  var env;

  // mocking an environment
  before(function () {
    env = process.env;
    process.env = { x: 2, y: 5 };
  });

  // running tests
  it('uses env variables correctly', function (done) {
    assert.equal(process.env.x * process.env.y, 10);
    done();
  });

  // restoring everything back
  after(function () {
    process.env = env;
  });
});

答案 1 :(得分:0)

这是一个非常常见的模式(由Leonid Beschastny回答)。

describe('env', function () {
  let envCache

  // mocking an environment
  before(() => {
    envCache = process.env;
  })

  // running tests
  it('reads env variables correctly', () => {
    process.env.x = 2
    process.env.y = 5

    assert.equal(process.env.x * process.env.y, 10)
  })

  // process.env is not just a plain object
  it('should convert undefined to a string', () => {
    process.env.UNDEF = undefined

    assert.equal(process.env.UNDEF, 'undefined')
  })

  // Trying to restore everything back
  after(() => {
    process.env = env
  })
})

然而,这里有一个问题。 process.env 不是一个普通对象。如果单独运行第二个测试,它将通过,因为 process.env 应该是这样工作的。相反,如果我们运行整个测试套件,第二个测试将失败

像这样设置测试会根据您运行测试的方式导致不同的行为。这是非常的坏事。

相反,您应该使用 delete 清除值,然后像这样重新分配它们:

describe('env', function () {
  let envCache

  // mocking an environment
  before(() => {
    envCache = process.env;
  })

  // running tests
  it('reads env variables correctly', () => {
    process.env.x = 2
    process.env.y = 5

    assert.equal(process.env.x * process.env.y, 10)
  })

  // process.env is not just a plain object
  it('should convert undefined to a string', () => {
    process.env.UNDEF = undefined

    assert.equal(process.env.UNDEF, 'undefined')
  })

  // Trying to restore everything back
  after(() => {
    Object.keys(process.env).forEach((key) => { delete process.env[key] })
    Object.entries(envCache).forEach(([ key, value ]) => {
      if (key !== undefined) {
        process.env[key] = value
      }
    })
  })
})

这将使行为更加一致,以防有人忘记您不应将 process.env 的键分配为 undefined 而不是删除它们。