如何在Jest中为我的测试添加<canvas>支持?

Adg*_*aza 17 jsdom html5-canvas reactjs jestjs

在我的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"
Run Code Online (Sandbox Code Playgroud)

我遇到了麻烦,弄清楚为什么我无法获得二维背景.也许我的测试配置存在问题?

"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
}
Run Code Online (Sandbox Code Playgroud)

sst*_*oss 27

如果安装了node-canvas库,Jest / jsdom可以处理canvas元素。

因此卸载jest-canvas-mock(如果已安装)并安装canvas

npm uninstall jest-canvas-mock
npm i --save-dev canvas
Run Code Online (Sandbox Code Playgroud)

  • 我最初尝试使用 jest-canvas-mock,但这确实很有帮助。 (2认同)

mik*_*1aj 15

这是因为您的测试不能在真实的浏览器中运行.Jest jsdom用于模拟DOM的必要部分,以便能够在Node中运行测试,从而避免浏览器通常会进行的样式计算和渲染.这很酷,因为这样可以快速进行测试.

另一方面,如果您的组件中需要浏览器API,那么在浏览器中则更加困难.幸运的是,jsdom支持画布.你只需要配置它:

jsdom包括支持使用canvas包来<canvas>使用canvas API 扩展任何元素.为了使这项工作,您需要将canvas作为依赖项包含在项目中,作为jsdom的同行.如果jsdom可以找到canvas包,它将使用它,但如果它不存在,那么<canvas>元素将表现得像<div>s.

或者,您可以使用像Karma这样的基于浏览器的测试运行器替换Jest .无论如何,Jest 非常多.

  • 旧的问题/答案,但是Jest从那时起已经有了很大的改进,并且让画布与jsdom一起工作(在大多数系统上)你需要做的就是`npm install canvas-prebuilt` - https://www.npmjs.com/package /帆布预建 (18认同)
  • 万一有人寻求解决方案,Jest附带了一个非常老的`jsdom`版本。如果将`jsdom`添加到依赖项并为`“ jest / ** / jsdom”:“ 13.0.0”`添加分辨率,则应该可以解决此问题。 (2认同)

Siv*_*iva 14

对于那些使用create-react-app寻找示例的人

安装

yarn add --dev jest-canvas-mock
Run Code Online (Sandbox Code Playgroud)

创建一个新的${rootDir}/src/setupTests.js

import 'jest-canvas-mock';
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,我将 `jest-canvas-mock` 添加到我的 `jest.config.js` 中,如下所示 `setupFiles: [ "jest-canvas-mock" ]` (10认同)
  • 创建 React 应用程序没有 jest.config.js 文件,我们需要创建它吗?当我们添加 setupFiles: [ "jest-canvas-mock" ] 时,它应该是什么样子? (2认同)
  • 什么导入了这个神秘的新“setupTests.js”文件?**如何**它*神奇地*使用? (2认同)

And*_*vic 6

对于我的用例,我做了像这样的简单猴子修补

beforeEach(() => {
    const createElement = document.createElement.bind(document);
    document.createElement = (tagName) => {
        if (tagName === 'canvas') {
            return {
                getContext: () => ({}),
                measureText: () => ({})
            };
        }
        return createElement(tagName);
    };
});
Run Code Online (Sandbox Code Playgroud)

无需安装canvas-prebuilt 或sinon。

  • 哦几个月后发现了我自己的评论 (3认同)