Rumah > Soal Jawab > teks badan
Saya mempunyai komponen tindak balas
import React, { useEffect, useRef, useState } from 'react'; import './PopularBrands.scss'; import LG from '../../../assets/images/brands/LG.png'; import Google from '../../../assets/images/brands/Google.jpeg'; import Apple from '../../../assets/images/brands/Apple.png'; import Boch from '../../../assets/images/brands/Boch.png'; import Dyson from '../../../assets/images/brands/Dyson.png'; import Philips from '../../../assets/images/brands/Philips.png'; import Samsung from '../../../assets/images/brands/Samsung.png'; import Simens from '../../../assets/images/brands/Simens.png'; import Sony from '../../../assets/images/brands/Sony.png'; import Xiomi from '../../../assets/images/brands/Xiomi.png'; import { FaChevronLeft } from 'react-icons/fa'; import { FaChevronRight } from 'react-icons/fa'; const PopularBrands = () => { const scrollViewRef = useRef<HTMLDivElement | null>(null); const [screenWidth, setScreenWidth] = useState(0); const [width, setWidth] = useState(0); const [widthTotal, setWidthTotal] = useState(0); const [showArrow, setShowArrow] = useState(false); useEffect(() => { function handleWindowResize() { if (scrollViewRef.current) setWidth(scrollViewRef.current.clientWidth); if (scrollViewRef.current) setWidthTotal(scrollViewRef.current.scrollWidth); } handleWindowResize(); window.addEventListener('resize', handleWindowResize); return () => { window.removeEventListener('resize', handleWindowResize); }; }, []); useEffect(() => { scrollViewRef.current?.scrollTo({ left: screenWidth, behavior: 'smooth' }); }, [screenWidth]); const toNextPage = () => { if (scrollViewRef && screenWidth <= widthTotal) { setScreenWidth(screenWidth + width); } }; const toPreviosPage = () => { if (scrollViewRef && screenWidth >= 0) { setScreenWidth(screenWidth - width); } }; return ( <div className="brandsContainer" onMouseEnter={() => setShowArrow(true)} onMouseLeave={() => setShowArrow(false)}> <div className="brands" ref={scrollViewRef}> <div> <img src={LG} alt="lg" /> </div> <div> <img src={Google} alt="Google" /> </div> <div> <img src={Apple} alt="Apple" /> </div> <div> <img src={Boch} alt="Boch" /> </div> <div> <img src={Dyson} alt="Dyson" /> </div> <div> <img src={Philips} alt="Philips" /> </div> <div> <img src={Samsung} alt="Samsung" /> </div> <div> <img src={Simens} alt="Simens" /> </div> <div> <img src={Sony} alt="Sony" /> </div> <div> <img src={Xiomi} alt="Xiomi" /> </div> </div> {screenWidth > 0 && showArrow && ( <div className="scrollIcon scrollBack" onClick={toPreviosPage}> <FaChevronLeft fontSize={30} /> </div> )} {screenWidth + width < widthTotal && showArrow && ( <div className="scrollIcon scrollNext" onClick={toNextPage}> <FaChevronRight fontSize={30} /> </div> )} </div> ); }; export default PopularBrands;
Ia berfungsi dengan baik dalam UI. Tetapi apabila saya menulis ujian unit berikut:
import React from 'react'; import { render, screen } from '@testing-library/react'; import PopularBrands from './PopularBrands'; describe('PopularBrands', () => { test.only('renders the component', () => { render(<PopularBrands />); expect(screen.getByAltText('lg')).toBeInTheDocument(); expect(screen.getByAltText('Google')).toBeInTheDocument(); expect(screen.getByAltText('Apple')).toBeInTheDocument(); expect(screen.getByAltText('Boch')).toBeInTheDocument(); expect(screen.getByAltText('Dyson')).toBeInTheDocument(); expect(screen.getByAltText('Philips')).toBeInTheDocument(); expect(screen.getByAltText('Samsung')).toBeInTheDocument(); expect(screen.getByAltText('Simens')).toBeInTheDocument(); expect(screen.getByAltText('Sony')).toBeInTheDocument(); expect(screen.getByAltText('Xiomi')).toBeInTheDocument(); }); });
Ujian gagal dan saya mendapat log ralat:
● PopularBrands › renders the component TypeError: _scrollViewRef$curren.scrollTo is not a function 37 | 38 | useEffect(() => { > 39 | scrollViewRef.current?.scrollTo({ left: screenWidth, behavior: 'smooth' }); | ^ 40 | }, [screenWidth]); 41 | 42 | const toNextPage = () => { at src/components/Directory/PopularBrands/PopularBrands.tsx:39:28
Saya cuba mendapatkan bantuan membetulkan ujian unit saya. Terdapat pergantungan pada screenWidth pada fungsi useEffect dan apabila perubahan itu kita tatal ke permulaan senarai ikon.
P粉2564870772024-03-30 00:35:31
Saya juga mengalami masalah yang sama. Saya dapat membuat ujian lulus dan menghapuskan ralat dengan menambah yang berikut:
Element.prototype.scrollTo = jest.fn();
Dengan menambahkan ini pada fail setupTests anda, ia sepatutnya menyingkirkan ralat, tetapi kerana ia adalah olok-olok sekarang, anda tidak akan dapat menguji fungsi eter.
Selain itu, saya suka perpustakaan ujian tidak bersedia atau dilengkapi untuk menguji acara tatal, jika anda ingin mengujinya, anda memerlukan persekitaran ujian berasaskan pelayar, bukan nod seperti jest dan test-library.
Semoga ini membantu.
Sunting 1:
Tetapi anda boleh menguji sama ada fungsi telah dipanggil, contohnya:
expect(Element.prototype.scrollTo).toHaveBeenCalled();