Как я могу настроить экземпляр jsdom, используемый jest?

Я столкнулся с этой проблемой При запросе systemjs в шутливых тестовых случаях выдается неверный URL-адрес

Один из последних комментариев намекает

«манипулировать экземпляром jsdom, чтобы он имел действительное местоположение / baseURI, установив конфигурацию реферера в jsdom».

Мне интересно, есть ли способ для меня сделать это? Могу ли я как-то получить доступ к экземпляру jsdom из объекта jest?


person user5325596    schedule 21.01.2016    source источник


Ответы (4)


У меня была аналогичная проблема при использовании проекта, требующего URL-адреса (location.href). Вы можете настроить jest с помощью testURL в своей конфигурации.

Вот что вы можете поместить в свой package.json (если вы так настраиваете jest).

"jest": {
    ...other config,
    "testURL": "http://localhost:8080/Dashboard/index.html"
}

документ testURL

Если вам нужны более конкретные изменения в jsdom, вы можете установить jsdom самостоятельно, импортировать и настроить его отдельно от jest. Вот пример:

test.js

'use strict';
import setup from './setup';
import React from 'react';
import { mount } from 'enzyme';
import Reportlet from '../components/Reportlet.jsx';

it('Reportlet Renders', () => {
    ...some test stuff
});

setup.js

import jsdom from 'jsdom';
const DEFAULT_HTML = '<html><body></body></html>';

// Define some variables to make it look like we're a browser
// First, use JSDOM's fake DOM as the document
global.document = jsdom.jsdom(DEFAULT_HTML);

// Set up a mock window
global.window = document.defaultView;
global.window.location = "https://www.bobsaget.com/"
// ...Do extra loading of things like localStorage that are not supported by jsdom
person Special Character    schedule 18.01.2017

Я только что пошел по этому пути и обнаружил, что начиная с Jest 21.2.1 официальным способом является создание собственной среды JSDom.

Это немного сложно настроить, но позволяет выполнить глубокую настройку.

Использованная литература:

Пример среды: https://github.com/mes/jest-environment-jsdom-external-scripts

person beckr    schedule 15.10.2017
comment
Это жесткий режим, конечно. Но я не вижу никаких других альтернатив, задокументированных в Интернете, и официальная позиция Jest, похоже, отрицательная. - person Tom; 01.07.2021

jsdom — это среда по умолчанию, которую использует последняя версия Jest, поэтому вы можете просто манипулировать глобальными переменными, такими как window, document или location.

person Evan Siroky    schedule 05.10.2016
comment
Начиная с jsdom v11, объект window.location становится недоступным для настройки и, следовательно, больше не может быть изменен с помощью Object.defineProperty(). - person Blackus; 30.11.2017

Если вы используете jsdom (версия 11.12.0) без jest (например, с ava + enzyme), вы можете указать URL-адрес в файле конфигурации jsdom.

Файл src/test/jsdom-config.js

const jsdom = require('jsdom') // eslint-disable-line
const { JSDOM } = jsdom

const dom = new JSDOM('<!DOCTYPE html><head/><body></body>', {
  url: 'http://localhost/',
  referrer: 'https://example.com/',
  contentType: 'text/html',
  userAgent: 'Mellblomenator/9000',
  includeNodeLocations: true,
  storageQuota: 10000000,
})
global.window = dom.window
global.document = window.document
global.navigator = window.navigator

Настройки AVA в package.json

{
  ...
  "scripts": ...
  ...
  "ava": {
    "babel": "inherit",
    "files": [
      "src/**/*.test.js"
    ],
    "verbose": true,
    "require": [
      "babel-register",
      "ignore-styles",
      "./src/test/jsdom-setup.js",
      "./src/test/enzyme-setup.js"
    ]
  }
}
person Serge Seletskyy    schedule 06.08.2018
comment
p.s. Я только что нашел этот вопрос, пытаясь решить мою нешуточную проблему. - person Serge Seletskyy; 06.08.2018