如何配置jest使用的jsdom实例?

时间:2016-01-21 15:34:29

标签: jestjs jsdom systemjs

我遇到了这个问题Invalid URL is thrown when requiring systemjs in jest test cases

最后一条评论建议

"通过在jsdom中设置referrer配置来操纵jsdom实例以获得有效的位置/ baseURI。"

我想知道我有办法做到这一点吗?我可以从jsdom对象以某种方式访问​​jest实例吗?

4 个答案:

答案 0 :(得分:4)

当使用需要url(location.href)的项目时,我遇到了类似的问题。您可以在配置中使用testURL配置jest。

以下是你可能放在package.json中的内容(如果这是你配置jest的方式)。

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

testURL Doc

如果您需要对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

答案 1 :(得分:1)

我刚刚沿着这条路走下去,发现从Jest 21.2.1开始,官方的方法是分叉你自己的JSDom环境。

设置这有点痛苦,但允许深入定制。

参考文献:

示例环境:https://github.com/mes/jest-environment-jsdom-external-scripts

答案 2 :(得分:0)

jsdom是最新版Jest使用的默认环境,因此您可以简单地操纵全局变量,例如windowdocumentlocation

答案 3 :(得分:0)

如果您使用的jsdom(版本11.12.0)不带jest(例如,ava + enzyme) 那么您可以在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

package.json中的AVA设置

{
  ...
  "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"
    ]
  }
}