首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我能用JSDOM欺骗instanceof吗?

我能用JSDOM欺骗instanceof吗?
EN

Stack Overflow用户
提问于 2020-09-22 20:22:33
回答 1查看 247关注 0票数 0

我有一个要测试的react类,这个类在一开始就有这样的if check:

代码语言:javascript
复制
if (!(root instanceof window.HTMLElement)) {
   throw new Error('No HTML element was supplied. );
}

我试图用jsdom传入一个假元素,但它没有“欺骗”instanceof检查。

代码语言:javascript
复制
const doc = (new JSDOM()).window.document;
const root = doc.createElement("div");
const pizza = new Builder(root);
expect(pizza).toBeDefined();

我已经查看了传入的内容

代码语言:javascript
复制
if (!(root instanceof window.HTMLElement)) {
  console.log(Object.prototype.toString.call(root));
  console.log(typeof window.HTMLElement)
  console.log(typeof root)
  throw new Error('No HTML element was supplied. );
}

它看起来一点也不像window.HTMLElement:

代码语言:javascript
复制
    console.log src/main.jsx:20
      [object HTMLDivElement]
    console.log src/main.jsx:21
      function
    console.log src/main.jsx:22
      object

我如何模拟window.HTMLElement以便测试这个类?

EN

Stack Overflow用户

回答已采纳

发布于 2020-09-23 20:28:00

您可以通过将它们指定为global的属性来模拟window的属性。在分配全局属性和使用全局属性创建元素之间,JSDOM的实例需要相同,否则HTMLElement的实例也将不同。为了绕过这一限制,我们将其引用为在beforeEach中设置的单个变量jsDomInstance,而不是实例化多个副本。

代码语言:javascript
复制
const { JSDOM } = require('jsdom')

const { instanceofCheck } = require('./instanceofCheck')
// const instanceofCheck = x => x instanceof window.HTMLElement

describe('JSDOM tests', () => {
    let jsDomInstance

    beforeEach(() => {
        jsDomInstance = new JSDOM()
        global.HTMLElement = jsDomInstance.window.HTMLElement
    })

    it('passes instanceof check', () => {
        expect(
            instanceofCheck(
                jsDomInstance.window.document.createElement('div')
            )
        ).toBe(true)
    })
})

Demo

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64009631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档