Обработчик изображения onLoad никогда не вызывался в Jest - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь проверить загрузку dataUrl в изображение с помощью Jest. Я использую JSDOM и следовал инструкции, чтобы добавить resources: "usable" в качестве опции.

Код работает, если я запускаю его непосредственно из Node, но когда я пытаюсь запустить его в Jest, обработчик образа onLoad никогда не вызывается, и поэтому тест никогда не завершается.

const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`, {
    resources: "usable",
});

global.window = dom.window;
global.document = dom.window.document;
global.navigator = global.window.navigator;

const dataUrlToImage = async (dataUrl) => {
    return new Promise(((resolve, reject) => {
        const img = document.createElement('img');
        img.crossOrigin = 'Anonymous';

        img.onload = function() { // Never called
            console.info('On load called'); 
            resolve(img);
        };

        img.src = dataUrl;
    }));
}

it('tests image loading', async () => {
    const r = await dataUrlToImage('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==');
    expect(!!r).toBe(true); // This is never called
});

Есть идеи, в чем может быть проблема?

1 Ответ

0 голосов
/ 22 июля 2019

Jest использует старую версию jsdom, которая работает только с canvas @ 1. Версия jsdom, которую вы получаете сейчас из npm, работает только с canvas@2.

Итак, я предполагаю, что вам не хватает либо npm install canvas@1, либо npm install canvas-prebuilt@1.

В качестве дополнительного примечания: jest поставляется со встроенным jsdom, вместо того, чтобы требовать собственную версию, вместо этого вы должны добавить testEnvironmentOptions: { resources: "usable" } к вашему jest.config.js, после чего вы можете удалить все шаблоны jsdom.

...