Javascript 如何用笑话测试节点列表

Javascript 如何用笑话测试节点列表,javascript,unit-testing,jestjs,jsdom,Javascript,Unit Testing,Jestjs,Jsdom,我尝试使用Jest测试一个javascript函数,该函数检查变量是否是节点列表。 这是一个浏览器功能,将在浏览器中使用。 以下是函数: /** * @description Check if input is a nodelist and return true or false. * @export * @param {*} input * @returns {boolean} */ export function $isNodeList(input) { return N

我尝试使用Jest测试一个javascript函数,该函数检查变量是否是节点列表。 这是一个浏览器功能,将在浏览器中使用。 以下是函数:

/**
 * @description Check if input is a nodelist and return true or false.
 * @export
 * @param {*} input
 * @returns {boolean}
 */
export function $isNodeList(input) {
    return NodeList.prototype.isPrototypeOf(input);
}
该函数在浏览器中运行良好,但如果我尝试使用jest测试它,则会出现以下错误:ReferenceError:NodeList未定义

测试文件为:

const esmImport = require("esm")(module);
const mod = esmImport("../tools/is_nodelist.js");

const html = '<!DOCTYPE html>\
                <html>\
                    <body>\
                        <div>Hello world</div>\
                        <div>Hello</div>\
                        <div>...</div>\
                    </body>\
                </html>';

const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const { document } = (new JSDOM(html)).window;

global.document = document;

test("expect nodeList to be nodelist", () => {
    let nodeList = global.document.querySelectorAll("div");
    expect(mod.$isNodeList(nodeList)).toBe(true);
});

test("expect htmlCollection not to be nodelist", () => {
    let htmlCollection = global.document.getElementsByTagName("div");
    expect(mod.$isNodeList(htmlCollection)).toBe(false);
});
const-esmport=require(“esm”)(模块);
const mod=esimport(“../tools/is_nodelist.js”);
常量html=\
\
\
你好,世界\
你好\
...\
\
';
const jsdom=require(“jsdom”);
const{JSDOM}=JSDOM;
const{document}=(新JSDOM(html)).window;
global.document=文件;
测试(“期望节点列表是节点列表”,()=>{
让nodeList=global.document.queryselectoral(“div”);
expect(mod.$isNodeList(nodeList)).toBe(true);
});
测试(“期望htmlCollection不是节点列表”,()=>{
让htmlCollection=global.document.getElementsByTagName(“div”);
expect(mod.$isNodeList(htmlCollection)).toBe(false);
});
我的测试出了什么问题以及如何正确地测试该函数?

您可以设置
jest.config.js
文件的配置。这样您就不需要在测试文件中显式地使用
jsdom

例如

index.js

导出函数$isNodeList(输入){
返回NodeList.prototype.isPrototypeOf(输入);
}
index.test.js

import*作为mod from';
描述('59947808',()=>{
测试('期望节点列表是节点列表',()=>{
让nodeList=document.queryselectoral('div');
log('nodeList:',nodeList);
expect(mod.$isNodeList(nodeList)).toBe(true);
});
test('expected htmlCollection not be nodelist',()=>{
让htmlCollection=document.getElementsByTagName('div');
log('htmlCollection:',htmlCollection);
expect(mod.$isNodeList(htmlCollection)).toBe(false);
});
});
单元测试结果:

通过src/stackoverflow/59947808/index.test.js(8.528s)
59947808
✓ 预期节点列表为节点列表(11ms)
✓ 期望htmlCollection不是节点列表(1ms)
console.log src/stackoverflow/59947808/index.test.js:6
节点列表:节点列表{}
console.log src/stackoverflow/59947808/index.test.js:12
htmlCollection:htmlCollection{}
测试套件:1个通过,共1个
测试:2次通过,共2次
快照:共0个
时间:9.773s
jest.config.js

module.exports={
预设:'ts jest/presets/js with ts',
测试环境:“jsdom”,
};
源代码: