如何对Jest测试进行沙箱测试

时间:2018-11-07 21:40:13

标签: node.js jestjs

根据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之类的东西不会被沙盒化,但这是吗?我对“沙盒”不了解什么?

1 个答案:

答案 0 :(得分:2)

Jest中的沙箱似乎仅在默认情况下发生在文件中,而不发生在同一文件中的单个测试中。

这是因为默认情况下,Jest不会取消缓存模块。

但是它确实提供了jest.resetModules函数,您可以在每次测试前调用它:

beforeEach(() => {
  jest.resetModules()
});

这将取消缓存模块并启用沙箱。
您还可以通过在resetModules中设置package.jsonconfigure Jest

{
  "name": "my-project",
  "jest": {
    "resetModules": true
  }
}

要利用这些设置,您需要在每次测试中require(已经在做)。我之所以这样说是因为,即使您调用了jest.resetModules,如果在文件顶部只有一个require,您的测试也会失败。