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