“Matchers<any>”类型上不存在属性“toBeInTheDocument”

man*_*tty 29 testing mocha.js reactjs jestjs

我正在尝试为我的简单 React 应用程序编写测试,该应用程序使用 API 等为狗收容所创建 UI。我导入了如下所示的模块并运行以下命令

npm install jest-dom react-testing-library --save-dev
Run Code Online (Sandbox Code Playgroud)

但是,我得到了 toBeInTheDocument(); 红色下划线的方法和错误消息

"Property 'toBeInTheDocument' does not exist on type 'Matchers<any>'."
Run Code Online (Sandbox Code Playgroud)
import "react-testing-library/cleanup-after-each";
import "jest-dom/extend-expect";

import * as React from "react";
import PetCard from "./PetCard";
import Pet from "./Pet";
import { render } from "react-testing-library";

const petMock = {
  id: "225c5957d7f450baec75a67ede427e9",
  name: "Fido",
  status: "available",
  kind: "dog",
  breed: "Labrador",
} as Pet;

describe("PetCard", () => {
  it("should render the name", () => {
    const { getByText } = render(<PetCard pet={petMock} />);
    expect(getByText("Fido")).toBeInTheDocument();
  });

});
Run Code Online (Sandbox Code Playgroud)

任何有关我如何解决此问题的建议表示赞赏。

Pet*_*ter 37

请确保在您的项目中安装了正确的类型。IE

npm i -D @testing-library/jest-dom@^4.2.4

根据我的经验,5.x 版似乎缺少 Typescript 类型

  • 您可能还需要安装类型:`@types/testing-library__jest-dom` (15认同)
  • 如果添加“@testing-library/jest-dom”后仍然遇到此问题。确保在您的测试文件中导入了 `import '@testing-library/jest-dom';`。[此评论](https://github.com/testing-library/jest-dom/issues/123#issuecomment-689689656)中提到 (7认同)
  • [本期](https://github.com/testing-library/jest-dom/issues/123)解释了为什么他们从核心中删除了类型定义。 (2认同)
  • 我认为“npm i -D @testing-library/jest-dom”会更好,它解决了我的问题:-) (2认同)

Gre*_*Woz 33

上面的大多数解决方案似乎都解决了 Babel 或 Eslint。如果你对tslint纯 Typescript有这个问题,添加:@testing-library/jest-dom到你的类型就足够了

所以在你的打字稿配置中: //tsconfig.json

"types": ["node", "jest", "@testing-library/jest-dom"],
Run Code Online (Sandbox Code Playgroud)

还请记住,您应该将该库包含在 Jest 中。与其在每个文件中都导入它,不如在配置文件中进行:

setupFilesAfterEnv: [
   "<rootDir>/support/setupTests.js"
],
Run Code Online (Sandbox Code Playgroud)

然后在文件中setupTests.js

import '@testing-library/jest-dom/extend-expect'
Run Code Online (Sandbox Code Playgroud)

require()如果直接使用 TypeScript,甚至可以切换到。

  • `"types": ["node", "jest", "@testing-library/jest-dom"]` 不应该在 ts-configs 中吗? (8认同)
  • 这几乎让一切都为我工作。必须删除并重新添加 jest-dom 类型并重新启动 VS Code,然后一切正常!即我做了一个 `yarn remove @testing-library/jest-dom` 和一个 `yarn add @testing-library/jest-dom@XXX`,其中 XXX 是我刚刚删除的 package.json 中的版本。看起来还添加了 `"@types/testing-library__jest-dom": "^5"` 到我的 devDependency 中,这可能是修复程序 (3认同)

PAS*_*LoD 30

对于pnpm用户(他们可能想知道为什么 npm 开箱即用),这是因为 pnpm 使用半严格的 node_modules 布局,这意味着只有少数包被提升到顶部(即可以通过简单的 import/require 访问) )

请参阅此处的文档:https://pnpm.io/blog/2020/10/17/node-modules-configuration-options-with-pnpm#the-default-setup

这就是为什么如果您使用 pnpm,当前需要的快速修复是

pnpm add -D @types/testing-library__jest-dom
Run Code Online (Sandbox Code Playgroud)

为了使其更加健壮,可以编辑 .npmrc 并仅提升缺少的依赖项。吊装设置

例如

public-hoist-pattern[]=@vitest/expect # if using vitest
public-hoist-pattern[]=@jest/expect # if using jest
Run Code Online (Sandbox Code Playgroud)


Ale*_*oro 15

就我而言,这足以:

  • 添加到devDependencies 中的package.json并安装:
"@testing-library/jest-dom": "^5.11.9",
Run Code Online (Sandbox Code Playgroud)
  • 添加到.spec文件:
import '@testing-library/jest-dom';
Run Code Online (Sandbox Code Playgroud)


Evg*_*ova 11

eslint 覆盖没有帮助,但是

import '@testing-library/jest-dom/extend-expect'
Run Code Online (Sandbox Code Playgroud)

在测试文件的乞求中解决了它。

我在这里以及来自 facebook 官方react starter app的 jest 设置文件中找到了这个答案。我希望它有帮助。

  • 最新版本的“@testing-library/jest-dom”不再存在这种情况 (2认同)

thi*_*ign 9

最近版本的@testing-library/jest-dom(例如5.11.2)开箱即用,对我来说问题是由 cypress 类型与@types/chai使用的冲突引起的@testing-library

由于 Chai 和 jQuery 是命名空间(全局),不兼容的版本会导致包管理器(yarn 或 npm)嵌套并包含多个定义并导致冲突。

https://docs.cypress.io/guides/tooling/typescript-support.html#Configure-tsconfig-json

cypress通过在顶级 TS 配置中不包含该文件夹而是添加以下内容来解决cypress/tsconfig.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "baseUrl": "../node_modules",
    "types": ["cypress"]
  },
  "include": [
    "**/*.ts"
  ]
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*Woz 9

babel-jest如果您用于穿越,则所选答案通常是正确的。

对于那些由于以下错误而仍在苦苦挣扎的人:

  • Property 'toBeInTheDocument' does not exist on type 'JestMatchers<HTMLElement>'.
  • 这会导致Cannot use import statement outside a module如果您尝试添加importjest.afterEnv 文件

用 babel 解决这个问题可能会导致一些问题,比如 Cannot use import statement outside a module由于两者的工作方式不同。因此,如果想纯粹使用它来解决它ts-jest(这意味着在你的笑话配置中你有类似的行):

transform: {
  "^.+\\.(ts|tsx)$": "ts-jest"
},
Run Code Online (Sandbox Code Playgroud)

并且常见答案没有任何效果,然后按照以下步骤操作:

  1. 显而易见,安装@testing-library/jest-dom使用:
npm install --save-dev @testing-library/jest-dom
Run Code Online (Sandbox Code Playgroud)
  1. 添加类型
"types": ["node", "jest", "@testing-library/jest-dom"]
Run Code Online (Sandbox Code Playgroud)

tsconfig.json上面类似。

  1. 在您的jest.config.js配置中添加以下内容:
...
setupFilesAfterEnv: [
  "@testing-library/jest-dom/extend-expect"
]
...
Run Code Online (Sandbox Code Playgroud)
  1. 现在,检查您roots: ["./src"],jest.config.js.
  • globals.d.ts创建一个在该路径中调用的新文件
  • 确保它"included"与您的正则表达式匹配tsconfig.json
  • 粘贴到globals.d.ts以下行:
import "@testing-library/jest-dom/extend-expect"
Run Code Online (Sandbox Code Playgroud)

不要将此行附加到您的traspiler 的postEnv jest 设置中ts-jest

运行您的测试并享受结果。

旁注:

  • 我的设置包括用于jestAPI 测试、E2E 测试、jestReact测试和堆栈中的浏览器测试- 现在一切都正常 - 所以不要放弃。supertestreact-testing-librarytestcafereact-testing-library
  • 确保您的jest.config.js所有扩展都被覆盖moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],特别是当您尝试运行.tsx测试时
  • 如果toBeInTheDocument()在此过程中 VSCode 将停止以红色突出显示,并且您的测试仍然抛出错误,您可能错过了config.json或config.json 中的有效types声明。tsconfig.jsonjest


Ada*_*dam 5

正如评论中所述,需要更改的是您的 eslint 配置。您应该更新您的eslintrc文件以包含测试文件的配置覆盖:

  ...
  overrides: [
    {
      files: [
        "**/*.test.js"
      ],
      env: {
        jest: true
      }
    }
  ]
Run Code Online (Sandbox Code Playgroud)

哪里"**/*.test.js"有一个与测试文件格式匹配的 glob。

更改eslintrc文件可确保您不必将eslint-env注释添加到每个测试文件的顶部。

请参阅此答案作为参考:/sf/answers/3444789841/
另请参阅 jest 环境配置:https://eslint.org/docs/user-guide/configuring#specifying-environments


exa*_*cae 5

import '@testing-library/jest-dom/extend-expect';
import '@testing-library/jest-dom';
Run Code Online (Sandbox Code Playgroud)

SetupTests.ts前面的这些行为我修复了它。


Val*_*Rob 5

我不知道是否有人需要阅读这篇文章。但我陷入了这个问题,因为我正在从 jest 重新导入一些函数。为了避免它,我删除了这个:

- import { describe, expect, it } from '@jest/globals';
Run Code Online (Sandbox Code Playgroud)