当前位置: 首页 > 面试题库 >

如何添加 支持我在Jest中的测试?

贡斌
2023-03-14
问题内容

在我的Jest单元测试中,我正在使用ColorPicker渲染组件。该ColorPicker组件创建一个canvas对象和2d上下文,但返回'undefined'则抛出错误"Cannot set property 'fillStyle' of undefined"

if (typeof document == 'undefined') return null; // Dont Render On Server
var canvas = document.createElement('canvas'); 
canvas.width = canvas.height = size * 2;
var ctx = canvas.getContext('2d'); // returns 'undefined'
ctx.fillStyle = c1; // "Cannot set property 'fillStyle' of undefined"

我在弄清楚为什么我无法获得2D上下文时遇到了麻烦。我的测试配置可能有问题吗?

"jest": {
  "scriptPreprocessor": "<rootDir>/node_modules/babel-jest",
  "unmockedModulePathPatterns": [
    "<rootDir>/node_modules/react",
    "<rootDir>/node_modules/react-dom",
    "<rootDir>/node_modules/react-addons-test-utils",
    "<rootDir>/node_modules/react-tools"
  ],
  "moduleFileExtensions": [
    "jsx",
    "js",
    "json",
    "es6"
  ],
  "testFileExtensions": [
    "jsx"
  ],
  "collectCoverage": true
}

问题答案:

这是因为您的测试未在真正的浏览器中运行。Jest
jsdom用于模拟DOM的必要部分,以便能够在Node中运行测试,从而避免了样式计算和呈现浏览器通常会执行的渲染。这很酷,因为这可以使测试更快。

另一方面,如果您的组件中需要浏览器API,则比在浏览器中困难。幸运的是,jsdom已经支持canvas了。您只需要配置它:

jsdom支持使用canvas包<canvas>通过canvas API
扩展任何html" target="_blank">元素。为了使这项工作有效,您需要将canvas作为依赖项包含在项目中,作为jsdom的对等体。如果jsdom可以找到canvas包,它将使用它,但是如果不存在,则<canvas>元素的行为将类似于<div>s。

另外,您可以用一些基于浏览器的测试运行程序(例如Karma)替换Jest
。笑话反正还是越野车。



 类似资料:
  • WebSocket 使用一种被称作“Upgrade handshake(升级握手)”的机制将标准的 HTTP 或HTTPS 协议转为 WebSocket。因此,使用 WebSocket 的应用程序将始终以 HTTP/S 开始,然后进行升级。这种升级发生在什么时候取决于具体的应用;可以在应用启动的时候,或者当一个特定的 URL 被请求的时候。 在我们的应用中,仅当 URL 请求以“/ws”结束时,我

  • 我总是在Jest测试中得到“localstorage is not defined”,这很有意义,但我有什么选择呢?撞上砖墙。

  • 我很清楚Java 7默认不支持基于GCM的密码。因此,我试图通过Bouncy Castle完成这项工作。 我在Tomcat的HTTPS连接器中配置了以下密码: 密码=“我们的研究结果是,他们的研究结果是一个有128个字符的CBC共有256个,他们的研究结果是一个有128个字符的RSA的研究结果是一个有128个字符的CBC共有256个,他们的研究结果是一个有128个字符的CBC共有128个字符的CB

  • 问题内容: 我添加了AsyncTask来将网络操作卸载到后台线程。我需要确保UI操作位于UI线程上,因此我想在Activity中使用runOnUiThread()。 谢谢你的帮助 WifiApManager connect.java 编辑 我想在TextView中显示已处理的文本 问题答案: 我添加了AsyncTask来将网络操作卸载到后台线程。我需要确保UI操作位于UI线程上,因此我想在Acti

  • 问题内容: 我自己的班级需要什么支持才能打印出来?例如,我有: 类应使用什么方法来使此代码起作用?也许是这样的: 我猜测该方法必须重载。我对吗?这够了吗? 问题答案: 您可以使用来打印任何对象。println的此重载版本将打印出您的对象的表示形式。如果要自定义要打印的内容,则必须重写该方法,例如: 如果不重写该方法,将使用class的默认实现,该实现具有以下形式(类名称和实例哈希码的十六进制表示形

  • 本文向大家介绍vue.js 添加 fastclick的支持方法,包括了vue.js 添加 fastclick的支持方法的使用技巧和注意事项,需要的朋友参考一下 fastclick:处理移动端click事件300毫秒延迟 1、兼容性 iOS 3及更高版本的移动Safari iOS 5及更高版本的Chrome Android上的Chrome(ICS) Opera Mobile 11.5及以上版本 An