使用JSDom设置location.hash和location.href

时间:2015-11-25 16:18:55

标签: javascript jsdom

我正在使用JSDom设置一些测试,我需要windowdocument全局变量,并且还需要为每个测试传递不同的URL / href。如何设置location.hashlocation.href属性?

global.document = jsdom({url: 'http://localhost?something=not#test', 'html': ''});
global.window = document.defaultView;
console.log(window.location.href); // returns 'about:blank'
console.log(window.location.hash); // returns no value

我尝试将值直接分配给window.location.hash,结果相同。

4 个答案:

答案 0 :(得分:5)

我也遇到了这个问题,但是无法让jsdom.env(...)解决方案起作用。我最终遵循了建议here,并使用了jsdom的changeURL函数。我的测试夹具设置看起来像这样:

beforeEach(function() {
  // snip...
  jsdom.changeURL(window, 'http://foo/bar')
  // snip...
})

答案 1 :(得分:2)

很多这些答案都是旧的。较新的 jsdom 版本不允许您像以前那样覆盖内容。您正在寻找的是可能reconfigure 函数。

import { JSDOM } from 'jsdom';

const jsdom = new JSDOM();

// ...
jsdom.reconfigure({
  url: 'https://www.test.com/whatever/url/you/want',
});
// ...

reconfigure() 的文档可以在 here 中找到。

查看 2020 年的 article 以了解更多信息。

答案 2 :(得分:1)

您可以在网址location.hash之后输入字符串来设置#。请参阅我的代码。

var jsdom = require("jsdom");

jsdom.env({
    url: 'http://localhost?something=not#hash', 'html': '',
    onload: function( window ) {
        console.log(window.location.href); // http://localhost/?something=not#hash
        console.log(window.location.hash); // #hash
    }
});

答案 3 :(得分:0)

这个对我有用。

Object.defineProperty(window.location, 'href', {
  writable: true,
  value: 'some url'
});