How can I configure the jsdom instance used by jest?

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP



How can I configure the jsdom instance used by jest?



I've come up against this issue Invalid URL is thrown when requiring systemjs in jest test cases



One of the last comments suggests



"manipulate the jsdom instance to have a valid location / baseURI by setting the referrer config in jsdom."



I'm wondering is there way for me to do that? Can I access the jsdom instance somehow from the jest object?


jsdom


jest




4 Answers
4



I had a similar issue when using a project requiring a url (location.href). You can configure jest with a testURL in your configuration.



Here is what you might put in your package.json (if that is how you configure jest).


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



testURL Doc



If you need more specific changes to jsdom you can install jsdom yourself and import and configure it separately from jest. Here is an example:



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



jsdom is the default environment that the latest version of Jest uses, so you can simply manipulate the global variables such as window, document or location.


window


document


location





From jsdom v11, window.location object become not configurable, and thus can not be modified with Object.defineProperty() anymore.
– Blackus
Nov 30 '17 at 14:48


window.location


Object.defineProperty()



I just went down this road and found out that as of Jest 21.2.1, the official way is to fork your own JSDom environment.



This is a bit painful to set up but allows in-depth customization.



References:



Sample environment: https://github.com/mes/jest-environment-jsdom-external-scripts



If you are using jsdom (ver 11.12.0) without jest (e.g. with ava + enzyme)
then you can set url in jsdom config file


jsdom


jest


ava + enzyme



File src/test/jsdom-config.js


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 settings in package.json


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"
]






p.s. I've just found this question while trying to solve my non-jest problem
– Serge Seletskyy
Aug 6 at 9:24






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

Firebase Auth - with Email and Password - Check user already registered

Dynamically update html content plain JS

Creating a leaderboard in HTML/JS