Jsdom: рдирдХрд▓реА рдХреИрдирд╡рд╛рд╕

рдХреЛ рдирд┐рд░реНрдорд┐рдд 22 рдорд╛рд░реНрдЪ 2017  ┬╖  25рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jsdom/jsdom

рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ( canvas / canvas-prebuilt ) рдХреЗ рдмрд┐рдирд╛ рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рдореИрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреИрдирд╡рд╛рд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ:

Not implemented: HTMLCanvasElement.prototype.getContext (without installing the canvas npm package)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣рд╛рдБ рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЖрдпрд╛ рд╣реВрдБ:

//
// Mock Canvas / Context2D calls
//
function mockCanvas (window) {
    window.HTMLCanvasElement.prototype.getContext = function () {
        return {
            fillRect: function() {},
            clearRect: function(){},
            getImageData: function(x, y, w, h) {
                return  {
                    data: new Array(w*h*4)
                };
            },
            putImageData: function() {},
            createImageData: function(){ return []},
            setTransform: function(){},
            drawImage: function(){},
            save: function(){},
            fillText: function(){},
            restore: function(){},
            beginPath: function(){},
            moveTo: function(){},
            lineTo: function(){},
            closePath: function(){},
            stroke: function(){},
            translate: function(){},
            scale: function(){},
            rotate: function(){},
            arc: function(){},
            fill: function(){},
            measureText: function(){
                return { width: 0 };
            },
            transform: function(){},
            rect: function(){},
            clip: function(){},
        };
    }

    window.HTMLCanvasElement.prototype.toDataURL = function () {
        return "";
    }
}
const document = jsdom.jsdom(undefined, {
  virtualConsole: jsdom.createVirtualConsole().sendTo(console)
});

const window = document.defaultView;
mockCanvas(window);

рд╕рднреА 25 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛:

const utils = require("jsdom/lib/jsdom/utils");
const canvasMock = require("canvas-mock");

function Canvas () {
    canvasMock(this);
    this.toDataURL = function() { return ""; }
}
utils.Canvas = Canvas;

рдХреГрдкрдпрд╛ рдРрд╕рд╛ рди рдХрд░реЗрдВред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреИрдЪ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, getContext() рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рдд window.HTMLCanvasElement.prototype.getContext = ...

рдзрдиреНрдпрд╡рд╛рдж @ рдбреЛрдорд┐рдирд┐рдХ !

@domenic рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдореЗрд░реА рдУрд╡рд░рд░рд╛рдЗрдб рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЬреЗрд╕реНрдЯ рдФрд░ рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

import { jsdom } from 'jsdom';
import mockLocalStorage from './mockLocalStorage';
import jQuery from 'jquery';
import Backbone from 'backbone';
import moment from 'moment';

const dom = jsdom('<!doctype html><html><body></body></html>');
const { window } = dom.defaultView;

function copyProps(src, target) {
    const props = Object.getOwnPropertyNames(src)
        .filter(prop => typeof target[prop] === 'undefined')
        .map(prop => Object.getOwnPropertyDescriptor(src, prop));
    Object.defineProperties(target, props);
}

//Mock canvas (used by qtip)
window.HTMLCanvasElement.prototype.getContext = () => {
    return {};
};

global.window = window;
global.document = window.document;
global.navigator = {
    userAgent: 'node.js',
};
global.localStorage = mockLocalStorage;
global.jQuery = jQuery;
global.$ = jQuery;
global.fetch = () => Promise.resolve();
Backbone.$ = jQuery;
copyProps(window, global);

//Mock Mousetrap (only works in browser)
jest.mock('mousetrap', () => { return { bind: () => {}}});

//Set moment locale for all tests
moment.locale('sv');

рдиреЛрдб рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рджреВрд╖рдг рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрд╣реБрдд рдкреБрд░рд╛рдирд╛ рдФрд░ рдмрдбрд╝рд╛ рдХреЛрдб рдЖрдзрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЬреЗрд╕реНрдЯ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред
рдЬреЗрд╕реНрдЯ рд╕рдВрд╕реНрдХрд░рдг: 21.2.1
Jsdom рд╕рдВрд╕реНрдХрд░рдг: 9.12.0

рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореЙрдХрд┐рдВрдЧ рдХреИрдирд╡рд╛рд╕ (рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдХреИрдирд╡рд╛рд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛) рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбреЙрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рди рдХреЗрд╡рд▓ рдХрд┐рд╕реА рдореБрджреНрджреЗ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд░реВрдк рдореЗрдВред

рдХреИрдирд╡рд╛рд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг

рдХреИрдирд╡рд╛рд╕-рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? рдпрд╣реА рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рд╡рд┐рди, рдореИрдХ рдФрд░ рд▓рд┐рдирдХреНрд╕, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдм рдХреБрдЫ x64 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╣рдо рдбреЙрдХреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рдПрдХрдореБрд╢реНрдд рдирдХрд▓реА рдореБрджреНрджреЛрдВ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рд╣рдордиреЗ рдЗрд╕реЗ https://github.com/tmpvar/jsdom#intervening -before-parsing рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдбрдмреЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИред

рдпрд╣рд╛рдБ рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЖрдпрд╛ рд╣реВрдБ:

//
// Mock Canvas / Context2D calls
//
function mockCanvas (window) {
    window.HTMLCanvasElement.prototype.getContext = function () {
        return {
            fillRect: function() {},
            clearRect: function(){},
            getImageData: function(x, y, w, h) {
                return  {
                    data: new Array(w*h*4)
                };
            },
            putImageData: function() {},
            createImageData: function(){ return []},
            setTransform: function(){},
            drawImage: function(){},
            save: function(){},
            fillText: function(){},
            restore: function(){},
            beginPath: function(){},
            moveTo: function(){},
            lineTo: function(){},
            closePath: function(){},
            stroke: function(){},
            translate: function(){},
            scale: function(){},
            rotate: function(){},
            arc: function(){},
            fill: function(){},
            measureText: function(){
                return { width: 0 };
            },
            transform: function(){},
            rect: function(){},
            clip: function(){},
        };
    }

    window.HTMLCanvasElement.prototype.toDataURL = function () {
        return "";
    }
}
const document = jsdom.jsdom(undefined, {
  virtualConsole: jsdom.createVirtualConsole().sendTo(console)
});

const window = document.defaultView;
mockCanvas(window);

рдмрд╣реБрдд - рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреИрдирд╡рд╛рд╕ рдкреНрд░реАрдмрд┐рд▓реНрдЯ рдкреИрдХреЗрдЬ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╣реИрд▓реЛ @ рдХреИрдЯрд░рдореЛ ,
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдбрд┐рдкреЛ рдореЗрдВ рдХреИрдирд╡рд╛рд╕-рдкреНрд░реАрдмрд┐рд▓реНрдЯ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрдкрдирд╛ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрджрд▓рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ? рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдкрд░ рдирд╣реАрдВ рд▓рд╛ рд╕рдХрддрд╛ рдпрд╣ рдореБрдЭреЗ рджреЗрддрд╛ рд╣реИ
Not implemented: HTMLCanvasElement.prototype.toBlob (without installing the canvas npm package)

@ рдореАрдХрд╛рдмреЗ
рдореИрдВрдиреЗ рдХреЛрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рддреЛ Jsdom рдХреИрдирд╡рд╛рд╕ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░ рд▓реЗрдЧрд╛ред

рд╢рд╛рдпрдж рд╡рд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ?

рдпрд╣ рдЕрдм yarn cache clean рдмрд╛рдж рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ! рдзрдиреНрдпрд╡рд╛рдж @ рдХреИрдЯрд░рдореЛ

рд╢рд╛рдпрдж рдЬреЗрд╕реНрдЯ-рдХреИрдирд╡рд╛рд╕-рдореЙрдХ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдорд╛рдзрд╛рди рд╕рд░рд▓ рд╣реИ, рдмрд╕ canvas рдХреЛ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдордЬрд╝рд╛рдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдБред

рд░реЗрдлрд░реА: https://github.com/jsdom/jsdom#canvas -support

рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ jsdom рдХреИрдирд╡рд╛рд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП lib/jsdom/utils.js рдкрд░ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ:

  exports.Canvas = require(moduleName);
  if (typeof exports.Canvas !== "function") {
    // In browserify, the require will succeed but return an empty object
    exports.Canvas = null;
  }

рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдХреИрдирд╡рд╛рд╕') рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреИрдирд╡рд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕реАрдзреЗ рдХреИрдирд╡рд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╛ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЧрд▓рдд рд╣реВрдБ? рдЬрдм рдореИрдВ рдХреИрдирд╡рд╛рд╕-рдкреНрд░реАрдмрд┐рд▓реНрдЯ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рддреЛ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреИрдирд╡рд╛рд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рд╣реИред рдореИрдВ рдХреИрдирд╡рд╛рд╕ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг 2.0.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг (1.6.x) рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬрд┐рд╕рдХрд╛ JSDOM рдЗрд▓рд╛рдЬ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЖрдк рдмрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

HTMLCanvasElement.prototype.getContext = jest.fn()

рдпрджрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ

рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ jsdom рдХреИрдирд╡рд╛рд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП lib/jsdom/utils.js рдкрд░ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ:

  exports.Canvas = require(moduleName);
  if (typeof exports.Canvas !== "function") {
    // In browserify, the require will succeed but return an empty object
    exports.Canvas = null;
  }

рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдХреИрдирд╡рд╛рд╕') рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреИрдирд╡рд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕реАрдзреЗ рдХреИрдирд╡рд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╛ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЧрд▓рдд рд╣реВрдБ? рдЬрдм рдореИрдВ рдХреИрдирд╡рд╛рд╕-рдкреНрд░реАрдмрд┐рд▓реНрдЯ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рддреЛ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреИрдирд╡рд╛рд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рд╣реИред рдореИрдВ рдХреИрдирд╡рд╛рд╕ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг 2.0.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг (1.6.x) рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬрд┐рд╕рдХрд╛ JSDOM рдЗрд▓рд╛рдЬ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореЗрд░реА рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ jsdom рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд┐рдХреНрд╕ рдХреЛ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ https://github.com/jsdom/jsdom/pull/1964 рдореЗрдВ рдорд░реНрдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 13 рдмрд╛рдж рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, jsdom рд╕рдВрд╕реНрдХрд░рдг jest-environment-jsdom рдореЗрдВ рдЕрднреА рднреА ^11.5.1 рдкрд░ рдЕрдЯрдХрд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ:
https://github.com/facebook/jest/blob/2e2d2c8dedb76e71c0dfa85ed36b81d1f89e0d87/packages/jest-environment-jsdom/package.json#L14

рдХреИрдирд╡рд╛рд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛, рдпрд╛ рдХреИрдирд╡рд╛рд╕- рдкреНрд░реАрдмрд┐рд▓реНрдЯ HTMLCanvasElement рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рд╕рд╛рде рд╣реА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @endel рджреНрд╡рд╛рд░рд╛ рд╣реИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдХреИрдирд╡рд╛рд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ @hustcc рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдХрд╛рдлреА рд╕рд╛рдл рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд╕рд╛рде рдЬреЗрд╕реНрдЯ-рдХреИрдирд╡рд╛рд╕-рдореЙрдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

рдореИрдВ "рд╡реЗрдмрдХрд┐рдЯ рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛" рдЬреИрд╕реЗ рд╕рдВрджреЗрд╢ рджреЗрдЦ рд░рд╣рд╛ рдерд╛рдмреИрдХрд┐рдВрдЧрд╕реНрдЯреЛрд░PixelRatio of null", рд╕рд╛рде рд╣реА рд╕рд╛рде "
рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛: HTMLCanvasElement.prototype.getContext (рдХреИрдирд╡рд╛рд╕ npm рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛)", рдФрд░ рдХреИрдирд╡рд╛рд╕ (-prebuilt) рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛ред рдореИрдВ package-lock.json рдХреЗ рдЕрдВрджрд░ рдЧрдпрд╛, jsdom 13 рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jest-environment-jsdom рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ , рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рд╕реЗ рдПрдирдкреАрдПрдо рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ред рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЪрд▓реЗ рдЧрдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @paradite рд╕рд╣реА рд╣реИ, рдФрд░ рдордЬрд╛рдХ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЯрд┐рдХрдЯ рдЦреЛрд▓рд╛:

https://github.com/facebook/jest/issues/8016

рдлреАрдбрдмреИрдХ рдорд┐рд▓рд╛ред рдпрд╣ рдкреБрд░рд╛рдиреЗ рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЯрдХреЗ рд╣реБрдП рдордЬрд╛рдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдирд╡реАрдирддрдо рдиреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: https://www.npmjs.com/package/jest-environment-jsdom-thirteenред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдордЬрд╝рд╛рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣рд╛рдБ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд┐рд╖рдп рд╣реИред рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛..

@grtjn - рдЬреЗрд╕реНрдЯ-рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ- jsdom- рддреЗрд░рд╣ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреА, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдЕрднреА рднреА рдпреЗ 2 рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕реА рд╣реА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдорд┐рд▓реА рд╣реИрдВ

Error: Not implemented: HTMLCanvasElement.prototype.getContext (without installing the canvas npm package)
TypeError: Cannot read property 'fillRect' of null

рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ 10.15 рдПрдХ рдкрджрд╛рд╡рдирдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдРрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдПрдБ рдорд┐рд▓реА рд╣реИрдВ

Angular CLI: 7.2.4
Node: 10.15.0
OS: win32 x64
Angular: 7.2.4

рдПрдлрд╡рд╛рдИрдЖрдИ: рдореБрдЭреЗ рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ "testEnvironment": "jest-environment-jsdom-thirteen" рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рдХреИрдирд╡рд╛рд╕ рдкреИрдХреЗрдЬ, рд╕рд╛рде рд╣реА рдХрд╛рд╣рд┐рд░рд╛ рдУрдПрд╕ рдЯреВрд▓рд╕реЗрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдХреИрдирд╡рд╛рд╕-рдкреНрд░реАрдмрд┐рд▓реНрдЯ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рд╡реВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рдХрд╛рд╣рд┐рд░рд╛ рдУрдПрд╕ рдЯреВрд▓рд╕реЗрдЯ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ? рд╡рд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ред

@danieldanielecki 'рдХреИрдирд╡рд╛рд╕' рдкреИрдХреЗрдЬ рдХрд╛ рдореБрдЦреНрдп рдкреГрд╖реНрда рджреЗрдЦреЗрдВ: https://www.npmjs.com/package/canvas#compiling

@grtjn рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рд╢рд╛рдпрдж рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕рдХрд╛ рд▓рд╛рдн

рдиреЗрдХреНрд░реЛрдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди @grtjn jest-environment-jsdom-

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕