Cypress 组件测试缺失 package.json

Cypress Component Testing Missing package.json

我有一个使用 webpack 和 Cypress E2E 测试的 React 应用程序。我正在尝试使用 Cypress 组件测试。我写了一个简单的测试如下:

describe('Hello World Test',  () => {
    it ('Button', () => {
        mount(<Button>Test button</Button>)
        cy.get('button').contains('Test button').click()
    })
});

当我 运行 npx cypress open-ct 我得到以下错误:

Your pluginsFile threw an error from: .../experimentation/webpack-transition/cypress/plugins/index.js

Error: Cannot find module 'react-scripts/package.json'

当我查看我的 node_modules 文件夹时,

下不存在该文件
@cypress/react/plugins/react-scripts/package.json (DNE)

cypress.json如下:

{
  "baseUrl": "http://localhost:8080",
  "component": {
    "componentFolder": "src",
    "testFiles": "**/*spec.{js,jsx,ts,tsx}"
  }
}

package.json如下:

{
  "name": "webpack-transition",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "bundle": "webpack",
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack-dev-server --env ENV=dev --mode development --open --hot",
    "build": "webpack ---env ENV=dev --mode production"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.17.5",
    "@babel/plugin-proposal-class-properties": "^7.16.7",
    "@babel/plugin-proposal-object-rest-spread": "^7.17.3",
    "@babel/preset-env": "^7.16.11",
    "@babel/preset-react": "^7.16.7",
    "@babel/preset-typescript": "^7.16.7",
    "@types/react": "^17.0.40",
    "@types/react-dom": "^17.0.13",
    "awesome-typescript-loader": "^5.2.1",
    "babel-loader": "^8.2.3",
    "css-loader": "^6.7.1",
    "cypress": "^9.5.1",
    "dotenv-webpack": "^7.1.0",
    "html-webpack-plugin": "^5.5.0",
    "mini-css-extract-plugin": "^2.6.0",
    "source-map-loader": "^3.0.1",
    "style-loader": "^3.3.1",
    "typescript": "^4.6.2",
    "webpack": "^5.70.0",
    "webpack-cli": "^4.9.2",
    "webpack-dev-server": "^4.7.4"
  },
  "dependencies": {
    "@cypress/react": "^5.12.4",
    "@cypress/webpack-dev-server": "^1.8.2",
    "@emotion/react": "^11.8.2",
    "@emotion/styled": "^11.8.1",
    "@hookform/resolvers": "^2.8.8",
    "@mui/icons-material": "^5.5.0",
    "@mui/lab": "^5.0.0-alpha.72",
    "@mui/material": "^5.5.0",
    "@reduxjs/toolkit": "^1.8.0",
    "aws-amplify": "^4.3.16",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-hook-form": "^7.28.0",
    "react-icons": "^4.3.1",
    "react-redux": "^7.2.6",
    "yup": "^0.32.11"
  }
}

webpack.config如下:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const Dotenv = require('dotenv-webpack');

module.exports =  (env) => ({
  entry: './src/components/index.tsx',
  output: {
    path: path.join(__dirname, '/dist'),
    filename: 'bundle.js',
    publicPath: '/'
  },
  resolve: {
    extensions: ['.ts', '.tsx', '.js']
  },
  module: {
    rules: [
      {
        test: /\.(ts|js)x?$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader'
        },
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      },
      {
        test: /\.(png|svg|jpg|jpeg|gif|ico)$/,
        exclude: /node_modules/,
        use: ['file-loader?name=[name].[ext]']
      }
    ]
  },
  devServer: {
    historyApiFallback: true,
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './public/index.html',
      favicon: './public/favicon.ico'
    }),
    new MiniCssExtractPlugin({
      filename: './src/index.css',
    }),
    new Dotenv({
      path: `./.env.${env.ENV}`
    }),
  ]
});

我要么使用了错误版本的库,要么在某处缺少配置。

您似乎为 Create React App (CRA) 配置了 /cypress/plugins/index.js,但尚未使用它来创建您的 React 应用。

来自文档 Install

React(使用 CRA)

// cypress/plugins/index.js

module.exports = (on, config) => {
  if (config.testingType === 'component') {
    require('@cypress/react/plugins/react-scripts')(on, config)
  }
  return config
}

改为尝试 Generic Webpack 配置

// cypress/plugins/index.js

module.exports = (on, config) => {
 if (config.testingType === 'component') {
   const { startDevServer } = require('@cypress/webpack-dev-server')

   // Your project's Webpack configuration
   const webpackConfig = require('../../webpack.config.js')

   on('dev-server:start', (options) =>
     startDevServer({ options, webpackConfig })
   )
 }
}