开玩笑地嘲笑 document.createRange
Mocking document.createRange for jest
Jest,通过我想象的 JSDom,没有 document.createRange
定义。我如何覆盖或提供此行为?
我们为自定义 JSDom + mocha 设置编写的版本(运行 在所有测试之前)如下所示:
global.Range = function Range() {};
const createContextualFragment = (html) => {
const div = document.createElement('div');
div.innerHTML = html;
return div.children[0]; // so hokey it's not even funny
};
Range.prototype.createContextualFragment = (html) => createContextualFragment(html);
// HACK: Polyfil that allows codemirror to render in a JSDOM env.
global.window.document.createRange = function createRange() {
return {
setEnd: () => {},
setStart: () => {},
getBoundingClientRect: () => {
return { right: 0 };
},
getClientRects: () => [],
createContextualFragment,
};
};
有没有办法提供这个来开玩笑?
创建一个脚本来设置您想要的 polyfill -- 在这个例子中我们称之为 "mockument.js"。在你的 package.json
的开玩笑配置中设置 setupFiles
指向这个脚本:
"jest": {
"setupFiles": ["raf/polyfill", "./scripts/mockument"]
}
如上所示,您还可以使用模块名称(例如raf/polyfill
)。
一个 sweet 的事情是,您可以为测试的通用初始设置创建自己的模块,并在需要该功能的多个组件库中使用它们。
"jest": {
"setupFiles": ["@nteract/mockument"]
},
我按照 thread 中的描述在 setupTests.js
中添加了 polyfill。
if (window.document) {
window.document.createRange = () => ({
setStart: () => {},
setEnd: () => {},
commonAncestorContainer: {
nodeName: 'BODY',
ownerDocument: document,
},
});
}
为了让它与 TypeScript 一起工作,我必须在 commonAncestorContainer
.
上方添加 // @ts-ignore
Jest,通过我想象的 JSDom,没有 document.createRange
定义。我如何覆盖或提供此行为?
我们为自定义 JSDom + mocha 设置编写的版本(运行 在所有测试之前)如下所示:
global.Range = function Range() {};
const createContextualFragment = (html) => {
const div = document.createElement('div');
div.innerHTML = html;
return div.children[0]; // so hokey it's not even funny
};
Range.prototype.createContextualFragment = (html) => createContextualFragment(html);
// HACK: Polyfil that allows codemirror to render in a JSDOM env.
global.window.document.createRange = function createRange() {
return {
setEnd: () => {},
setStart: () => {},
getBoundingClientRect: () => {
return { right: 0 };
},
getClientRects: () => [],
createContextualFragment,
};
};
有没有办法提供这个来开玩笑?
创建一个脚本来设置您想要的 polyfill -- 在这个例子中我们称之为 "mockument.js"。在你的 package.json
的开玩笑配置中设置 setupFiles
指向这个脚本:
"jest": {
"setupFiles": ["raf/polyfill", "./scripts/mockument"]
}
如上所示,您还可以使用模块名称(例如raf/polyfill
)。
一个 sweet 的事情是,您可以为测试的通用初始设置创建自己的模块,并在需要该功能的多个组件库中使用它们。
"jest": {
"setupFiles": ["@nteract/mockument"]
},
我按照 thread 中的描述在 setupTests.js
中添加了 polyfill。
if (window.document) {
window.document.createRange = () => ({
setStart: () => {},
setEnd: () => {},
commonAncestorContainer: {
nodeName: 'BODY',
ownerDocument: document,
},
});
}
为了让它与 TypeScript 一起工作,我必须在 commonAncestorContainer
.
// @ts-ignore