考虑到这样的事情:
it('uses env variables correctly', function(done) {
assert.equal(process.env.x * process.env.y, 10);
});
我想为这一个测试设置x
和y
环境变量。这可能吗?
答案 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 而不是删除它们。