gpt4 book ai didi

javascript - 测试直接更改 DOM 的库

转载 作者:行者123 更新时间:2023-11-28 20:36:46 24 4
gpt4 key购买 nike

我编写了一个直接操作 DOM 的小型库,使用 windowdocument 来搜索和更改 DOM。现在我正试图弄清楚如何测试它。

到目前为止,我已经尝试了 jest 的组合+ jsdom :

const jsdom = require('jsdom');
const {JSDOM} = jsdom;

const dom = new JSDOM('<!DOCTYPE html><p>Hello world</p>');

// these two lines do not seem to do anything useful:
global.window = dom.window;
global.document = dom.window.document;

test('can globally access and search the DOM', () => {
// this doesn't work
expect(global.document.querySelectorAll('p').length).toBe(1);
});

我是不是做错了什么,还是我的测试方法完全错了?如果是这样,进行此类测试的正确方法是什么?

在所谓的端到端测试和单元测试之间,我觉得有点迷茫,因为在我的情况下,这似乎恰好介于两者之间。

理想情况下,我希望最终针对多个浏览器测试这个东西,并获得某种测试覆盖率。但这更像是下一步。现在我根本无法让它工作。

我知道网络世界的发展速度有多快,所以如果我完全错了,如果你能指出我今天正确的做法,我将不胜感激。


更新

在@duxfox 的一些建议之后,这是我的完整代码,因为使用这种方法我的库现在缺少事件 DOMContentLoaded,它应该触发它的 DOM 处理。

const jsdom = require('jsdom');
const {JSDOM} = jsdom;

const { document } = (new JSDOM('<!DOCTYPE html><p>Hello world</p>')).window;
global.document = document;

global.window = document.defaultView;
window.console = global.console;

Object.keys(document.defaultView).forEach((property) => {
if (typeof global[property] === 'undefined') {
global[property] = document.defaultView[property];
}
});

global.navigator = {
userAgent: 'node.js'
};

// Here I'm trying to follow a suggestion from Luis:
// https://stackoverflow.com/questions/36803733/jsdom-dispatchevent-addeventlistener-doesnt-seem-to-work
window.addEventListener('DOMContentLoaded', function (ev) {
console.log('DOMContentLoaded called!'); // this is not called.
/*
console.log('window click', ev.target.constructor.name,
ev.currentTarget.constructor.name);*/
});

// loading my library here:
// const root = require('../src');

test('something', () => {

// This now works, but my library is missing
// event DOMContentLoaded to start processing the DOM

expect(document.querySelectorAll('p').length).toBe(1);
});

最佳答案

下面是我与 mocha/chai/jsdom/enzyme 一起使用的 jsdom 设置脚本

看起来 global.window 应该设置为

dom.window.document.defaultView

而不是

dom.window

完整脚本,添加了其他全局属性:

var jsdom = require('jsdom');
const { JSDOM } = jsdom;

const { document } = (new JSDOM('')).window;
global.document = document;

global.window = document.defaultView;
window.console = global.console;

Object.keys(document.defaultView).forEach((property) => {
if (typeof global[property] === 'undefined') {
global[property] = document.defaultView[property];
}
});

global.navigator = {
userAgent: 'node.js'
};

关于javascript - 测试直接更改 DOM 的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51540912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com