首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在StencilJS测试中使用jest-dom会抛出错误

在StencilJS测试中使用jest-dom会抛出错误
EN

Stack Overflow用户
提问于 2020-11-13 01:36:42
回答 1查看 298关注 0票数 1

我在使用jest-dom的jest匹配器的StencilJS中进行了一个单元测试。当我运行测试时,它抛出了一个错误:

代码语言:javascript
复制
TypeError: Right-hand side of 'instanceof' is not an object
      at checkHtmlElement (node_modules/@testing-library/jest-dom/dist/utils.js:61:69)
      at Object.toHaveFormValues (node_modules/@testing-library/jest-dom/dist/to-have-form-values.js:75:31)
      at __EXTERNAL_MATCHER_TRAP__ (node_modules/expect/build/index.js:342:30)
      at Object.throwingMatcher [as toHaveFormValues] (node_modules/expect/build/index.js:343:15)

单元测试是:

代码语言:javascript
复制
import '@testing-library/jest-dom';
import { h } from '@stencil/core';
import { newSpecPage } from '@stencil/core/testing';
import { AgForm, FormRenderProps } from '../ag-form';
import {getByTestId} from "@testing-library/dom";

describe('ag-form', () => {
  it('sets initial string value', async () => {
    type TestFormValues = {
      stringValue: string;
    };

    const initialValues: TestFormValues = {
      stringValue: 'foo',
    };

    const page = await newSpecPage({
      components: [AgForm],
      template: () => (
        <ag-form
          initialValues={initialValues}
          renderer={(props: FormRenderProps<TestFormValues>) => {
            const { inputProps } = props;
            return (
              <form data-testid="test-form">
                <input {...inputProps('stringValue')} />
              </form>
            );
          }}
        />
      ),
    });

    const formElement = getByTestId(page.body, 'test-form')
    expect(formElement).toHaveFormValues(initialValues);
  });
});

错误是从jest-dom中的这个函数抛出的,它检查是否有一个有效的HTMLElement被传递到匹配器中:

代码语言:javascript
复制
function checkHtmlElement(htmlElement, ...args) {
  checkHasWindow(htmlElement, ...args);
  const window = htmlElement.ownerDocument.defaultView;

  if (!(htmlElement instanceof window.HTMLElement) && !(htmlElement instanceof window.SVGElement)) {
    throw new HtmlElementTypeError(htmlElement, ...args);
  }
}

有趣的是,错误来自if语句的右侧(因为window.SVGElement是未定义的),但我认为实际问题是它不应该到达代码的这一部分。在if语句的左侧,对htmlElement instanceof window.HTMLElement的检查返回为false,因为htmlElement的类型是HTMLFormElement,而window.HTMLElement的类型似乎是MockHtmlElement

所以我的问题是-有没有办法让jest-dom与StencilJS单元测试一起工作,因为模板设置的环境似乎不是jest-dom所期望的?

EN

回答 1

Stack Overflow用户

发布于 2020-11-28 00:30:02

在深入研究之后,我将回答我自己的问题,我认为答案就是jest-dom不适用于模板。

Jest的默认环境是jsdom,它用它在测试中创建一个类似浏览器的环境。然而,模板创建了自己的环境,Jest使用它自己的环境,包括自己的模拟DOM。这个模拟的DOM实现(到目前为止)还没有完整的功能,所以使用jsdom编写的库是失败的,比如jest-dom和DOM-jest library。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64808925

复制
相关文章

相似问题

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