我怎样才能用Jest测试swiper?

yqhsw0fo  于 2022-12-31  发布在  Jest
关注(0)|答案(4)|浏览(256)

我正在使用Jest创建Swiper的单元测试。
下面是我的代码:
https://codesandbox.io/s/swiper-default-react-forked-v0dnz?file=/src/App.test.jsx

● Test suite failed to run

    Cannot find module 'swiper/react' from 'src/App.jsx'

    Require stack:
      src/App.jsx
      src/App.test.jsx

      1 | import React from "react";
      2 | // Import Swiper React components
    > 3 | import { Swiper, SwiperSlide } from "swiper/react";
        | ^
      4 |
      5 | // Import Swiper styles
      6 | import "swiper/css";

      at Resolver.resolveModule (node_modules/jest-resolve/build/resolver.js:322:11)
      at Object.<anonymous> (src/App.jsx:3:1)

这个错误一直被报告,但是程序可以正常运行,有谁能帮我解决这个问题吗?

u4dcyp6a

u4dcyp6a1#

我想您在使用Swiper 7或更新版本时遇到了问题,因为Jest还不支持ESM包。
因此,即使它不是最佳解决方案,您也可以通过将其降级为Swiper 6来解决它
运行以下命令:

npm uninstall swiper
npm install swiper@6.8.4

并以如下方式导入:

import { Swiper, SwiperSlide } from 'swiper/react'
import 'swiper/swiper-bundle.min.css'
import 'swiper/swiper.min.css'
ny6fqffe

ny6fqffe2#

这似乎对我很有效(Swiper v8):
(in软件包. json)

"jest": {
    "moduleNameMapper": {
      "swiper/react": "swiper/react/swiper-react.js",
      "swiper/css": "swiper/swiper.min.css"
    },
    "transform": {
      "^.+\\.css$": "jest-transform-css"
    }
  }

(and也可以将其添加到transformIgnorePatterns

'node_modules/(?!(swiper|ssr-window|dom7)/)'
smdnsysy

smdnsysy3#

如果你不想测试Swiper v8的功能,但是想测试组件中的其他特性,可以尝试在jest文件中添加以下代码行:

jest.mock('Swiper', () => class Mocked {});

为nextjs工作,没有抱怨。也许不是最好的方式,但对我来说已经足够了。

ulydmbyx

ulydmbyx4#

我正在使用Swiper 8.4.2,这对我来说是有效的,而在Jest中使用Swiper。

TL;DR只需给予Jest配置

这是一个适合我的配置。

/* eslint-disable */
export default {
  displayName: "components",
  preset: "../../jest.preset.js",
  moduleNameMapper: {
    // Jest cannot understand this swiper import so we tell it where this points to
    "swiper/css": "swiper/swiper.min.css",
  },
  transform: {
    "^(?!.*\\.(js|jsx|ts|tsx|css|json)$)": "@nrwl/react/plugins/jest",
    "^.+\\.[tj]sx?$": ["babel-jest", { presets: ["@nrwl/react/babel"] }],
  },
  moduleFileExtensions: ["ts", "tsx", "js", "jsx"],
  coverageDirectory: "../../coverage/libs/components",
  setupFilesAfterEnv: ["<rootDir>/jest.setup.js"],
  transformIgnorePatterns: ["node_modules/(?!swiper|ssr-window|dom7)"],
};

关于配置的重要事项

有些东西可以忽略,因为它们是NX控制的monorepo所特有的,但是有几件事在这里很重要。所以忽略“nrwl”和“nx”的细节,因为我希望这部分关于变压器的内容已经为你的项目配置好了,不管你是使用NX还是其他东西。

我得到了什么错误?

因此,运行测试首先会抛出错误“Jest遇到意外的标记”和“SyntaxError:代码中此行的意外标记“export '”:

import { Navigation } from "swiper";

错误的实际来源是Swiper包中的这一行:

export { default as Swiper, default } from './core/core.js';

swiper|ssr-window|dom7添加到transformIgnorePatterns解决了该问题。
然后添加后,我得到了同样的错误,但此行:

import "swiper/css";

上面的答案之一设法帮助我做到这一点,实际上是因为它涉及到“moduleNameMapper”属性。
因此,将其添加到配置中解决了此特定导入的问题:

moduleNameMapper: {
    // Jest cannot understand this swiper import so we tell it where this points to
    "swiper/css": "swiper/swiper.min.css",
  },

希望这能帮助人们解决他们的问题,并实际了解配置的哪些部分解决了特定的问题。

相关问题