【问题标题】:Is it possible to use Jest with multiple presets at the same time?是否可以同时使用具有多个预设的 Jest?
【发布时间】:2018-12-02 18:55:54
【问题描述】:
是否可以将 Jest 与多个预设一起使用,比如 jsdom 和 react-native?
我想测试一个可以在 Web 和 React Native 环境中运行的 React 组件。问题是该组件可能使用 React Native 库或某些文档的方法。
当我运行一些测试时,开玩笑的回答:
无法从“react-native-implementation.js”中找到模块“NetInfo”
当我尝试添加时
"jest": {
"preset": "react-native"
}
到 package.json,我得到:
ReferenceError: 未定义窗口
【问题讨论】:
标签:
javascript
reactjs
unit-testing
react-native
jestjs
【解决方案1】:
对于正在寻找一个预设和 typeScript 的人
const { defaults: tsjPreset } = require('ts-jest/presets')
module.exports = merge.recursive(ts_preset, puppeteer_preset, {
preset: 'Your_Preset',
transform: tsjPreset.transform,
},
})
【解决方案2】:
按照同样的思路,您可以使用扩展运算符执行此操作:
const tsPreset = require('ts-jest/jest-preset')
const puppeteerPreset = require('jest-puppeteer/jest-preset')
module.exports = {
...tsPreset,
...puppeteerPreset,
globals: {
test_url: `http://${process.env.HOST||'127.0.0.1'}:${process.env.PORT||3000}`,
},
}
【解决方案3】:
预设只是普通的 Javascript 对象,因此在许多情况下您可以简单地合并它们。例如,这就是我同时启用ts-jest 和jest-puppeteer 的方式:
const merge = require('merge')
const ts_preset = require('ts-jest/jest-preset')
const puppeteer_preset = require('jest-puppeteer/jest-preset')
module.exports = merge.recursive(ts_preset, puppeteer_preset, {
globals: {
test_url: `http://${process.env.HOST || '127.0.0.1'}:${process.env.PORT || 3000}`,
},
})
如果某些选项不能像那样“合并”,只需手动处理这些情况。
【讨论】:
-
merge 将多个对象合并为一个,可选择创建一个新的克隆对象。类似于 jQuery.extend 但更灵活。在 Node.js 和浏览器中工作。