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

Javascript 是否可以只为一个测试设置环境变量?,javascript,node.js,mocha.js,Javascript,Node.js,Mocha.js,考虑到这样的情况: it('uses env variables correctly', function(done) { assert.equal(process.env.x * process.env.y, 10); }); 我只想为这个测试设置x和y环境变量。这可能吗?以下是最常见的方法: describe('env', function () { var env; // mocking an environment before(function () {

考虑到这样的情况:

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

我只想为这个测试设置
x
y
环境变量。这可能吗?

以下是最常见的方法:

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;
  });
});

下面是一个非常常见的模式(如所回答的)

然而,这里有一个问题<代码>进程.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
的密钥指定为未定义的,而不是删除它们。

我认为在节点中不可能这样做,通常,您可以通过访问process.env全局变量的
x
y
来通过节点执行beforeTest变量集,但这是一种不好的做法。但有一个问题,为什么要测试NodeJs的功能?也许你应该重新考虑一下这个测试的必要性。
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
      }
    })
  })
})