I am writing tests for React component with @testing-library/react and vitest. Here is my code:
It works fine, but for some reason I get these annoying warnings:
This problem also occurs with other components (although the test doesn't fail):
I would like to understand why this is happening and how to fix it. I saw a similar question asked here before, but the solutions recommended there didn't help me.
App.test.jsx
import {screen} from "@testing-library/react";
import {describe, expect} from "vitest";
import App from "@components/App/App";
import {renderWithProviders} from "@utils/utils-for-tests/renderWithProwiders";
describe('App', () => {
it('Renders App', () => {
renderWithProviders(<App />);
expect(screen.getByRole('banner')).toBeInTheDocument()
expect(screen.getByRole('main').toBeInTheDocument)
expect(screen.getByRole('contentinfo').toBeInTheDocument)
});
});;
Header.test.jsx
import {describe, expect} from "vitest";
import {renderWithProviders} from "@utils/utils-for-tests/renderWithProwiders";
import Header from "@components/Header/Header";
import {MemoryRouter} from "react-router-dom";
import {waitFor,screen} from "@testing-library/react";
import userEvent from "@testing-library/user-event";
describe('Header', () => {
it('check search', async ()=>{
renderWithProviders(<MemoryRouter><Header/></MemoryRouter>)
const input = screen.getByPlaceholderText(/Search here.../i)
await userEvent.type(input, "Test");
await waitFor(()=>{
expect(input).toHaveValue("Test")
})
await userEvent.click(screen.getByRole('button',{name: /search-submit/i}));//should reset input field
await waitFor(()=>{
expect(input).not.toHaveValue("Test")
})
})
});
setup.js for vitest
import { expect, afterEach } from 'vitest';
import { cleanup } from '@testing-library/react';
import matchers from '@testing-library/jest-dom/matchers';
// extends Vitest's expect method with methods from react-testing-library
expect.extend(matchers);
// runs a cleanup after each test case (e.g. clearing jsdom)
afterEach(() => {
cleanup();
});
vite.config.js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import eslint from 'vite-plugin-eslint'
const path = require('path')
// https://vitejs.dev/config/
export default defineConfig({
resolve:{
alias:{
'@' : path.resolve(__dirname, './src'),
'@components' : path.resolve(__dirname, './src/components'),
'@pages' : path.resolve(__dirname, './src/pages'),
'@assets' : path.resolve(__dirname, './src/assets'),
'@hooks' : path.resolve(__dirname, './src/hooks'),
'@store' : path.resolve(__dirname, './src/store'),
'@slices' : path.resolve(__dirname, './src/store/slices'),
'@fonts' : path.resolve(__dirname, './src/assets/fonts'),
'@utils' : path.resolve(__dirname, './utils'),
},
},
plugins: [react(),eslint()],
test: {
globals: true,
environment: 'jsdom',
setupFiles: './tests/setup.js',
coverage: {
reporter: ['text', 'json', 'html'],
}
},
})
package.json
{
"name": "e-commerce",
"private": true,
"version": "0.0.0",
"scripts": {
"dev": "vite --open",
"build": "vite build",
"test": "vitest --ui",
"coverage": "vitest run --coverage",
"preview": "vite preview"
},
"eslintConfig": {
"extends": [
"plugin:react-hooks/recommended",
"react-app"
],
"parserOptions": {
"sourceType": "module",
"ecmaVersion": 2020,
"ecmaFeatures": {
"jsx": true
}
}
},
"dependencies": {
"@reduxjs/toolkit": "^1.9.1",
"firebase": "^9.15.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hook-form": "^7.41.3",
"react-redux": "^8.0.5",
"react-router-dom": "^6.6.1",
"redux": "^4.2.0",
"sass": "^1.57.1"
},
"devDependencies": {
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^14.4.3",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.9",
"@vitejs/plugin-react-swc": "^3.0.0",
"@vitest/ui": "^0.26.3",
"classnames": "^2.3.2",
"eslint": "^8.31.0",
"eslint-config-react-app": "^7.0.1",
"eslint-plugin-react-hooks": "^4.6.0",
"jsdom": "^21.0.0",
"vite": "^4.0.0",
"vite-plugin-eslint": "^1.8.1",
"vitest": "^0.26.3"
}
}
I found the solution. I don't need to import {describe, expect} from 'vitest'