How can I configure the jsdom instance used by jest?

前端 未结 4 1153
清歌不尽
清歌不尽 2021-02-13 23:07

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 instan

相关标签:
4条回答
  • 2021-02-13 23:30

    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.

    0 讨论(0)
  • 2021-02-13 23:38

    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
    
    0 讨论(0)
  • 2021-02-13 23:49

    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:

    • https://github.com/facebook/jest/issues/2484#issuecomment-270174381
    • https://github.com/facebook/jest/issues/2460#issuecomment-324630534

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

    0 讨论(0)
  • 2021-02-13 23:49

    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

    File 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

    {
      ...
      "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"
        ]
      }
    }
    
    0 讨论(0)
提交回复
热议问题