根据Jest文档:
“沙盒测试文件和每个测试的自动全局状态重置,因此没有两个测试相互冲突。”
但是我的测试有冲突。
代码:
// Note: op is from object-path module for deep access by dot path
let config = { name: 'Bob' }
const getConfig = path => {
return op.get(config, path)
}
const setConfig = (path, value) => {
return op.set(config, path, value)
}
测试:
test('setConfig() updates a deep config value', () => {
const { setConfig, getConfig } = require('services/config')
setConfig('name', 'Woot')
const res = getConfig('name')
expect(res).toBe('Woot')
})
test('getConfig() updates a deep config value', () => {
const { getConfig } = require('services/config')
const res = getConfig('name')
expect(res).toBe('Bob') // Actually Woot
})
第一个测试会修改配置文件,从而导致第二个测试失败。
根据我的经验,process.env
之类的东西不会被沙盒化,但这是吗?我对“沙盒”不了解什么?
答案 0 :(得分:2)
Jest中的沙箱似乎仅在默认情况下发生在文件中,而不发生在同一文件中的单个测试中。
这是因为默认情况下,Jest不会取消缓存模块。
但是它确实提供了jest.resetModules
函数,您可以在每次测试前调用它:
beforeEach(() => {
jest.resetModules()
});
这将取消缓存模块并启用沙箱。
您还可以通过在resetModules
中设置package.json
来configure Jest:
{
"name": "my-project",
"jest": {
"resetModules": true
}
}
要利用这些设置,您需要在每次测试中require
(已经在做)。我之所以这样说是因为,即使您调用了jest.resetModules
,如果在文件顶部只有一个require
,您的测试也会失败。