我有一个CarCard
组件,其中列出了汽车信息。如果您将鼠标悬停并单击View More,则会显示一个模态并显示更多详细信息。我想写一个单元测试,当我点击这个按钮时,模态是否打开。我怎么能写?
CarCard组件:
const CarCard: React.FC<CarCardProps> = ({ car }) => {
const { city_mpg, year, make, model, transmission, drive } = car;
const [isOpen, setIsOpen] = useState(false);
const carRent = calculateCarRent(city_mpg, year);
return (
<div className="car-card group">
<div className="car-card__content">
<h2 className="car-card__content-title">
{make} {model}
</h2>
</div>
<p className="flex mt-6 text-[32px] font-extrabold">
<span className="self-start text-[14px] font-semibold">$</span>
{carRent}
<span className="self-end text-[14px] font-medium">/day</span>
</p>
<div className="relative w-full h-40 my-3 object-contain">
<Image
src={generateCarImageUrl(car)}
alt="car model"
fill
priority
className="object-contain"
/>
</div>
<div className="relative flex w-full mt-2">
<div className="flex group-hover:invisible w-full justify-between text-gray">
<div className="flex flex-col justify-center items-center gap-2">
<Image
src="/steering-wheel.svg"
width={20}
height={20}
alt="steering wheel"
/>
<p className="text-[14px]">
{transmission === "a" ? "Automatic" : "Manual"}
</p>
</div>
<div className="flex flex-col justify-center items-center gap-2">
<Image src="/tire.svg" width={20} height={20} alt="tire" />
<p className="text-[14px]">{drive.toUpperCase()}</p>
</div>
<div className="flex flex-col justify-center items-center gap-2">
<Image
src="/gas.svg"
width={20}
height={20}
alt="gas"
className="w-auto h-auto"
/>
<p className="text-[14px]">{city_mpg} MPG</p>
</div>
</div>
<div className="car-card__btn-container">
<CustomButton
title="View More"
containerStyles="w-full py-[16px] rounded-full bg-primary-blue"
textStyles="text-white text-[14px] font-bold"
rightIcon="/right-arrow.svg"
handleClick={() => setIsOpen(true)}
/>
</div>
</div>
<CarDetails
isOpen={isOpen}
closeModal={() => setIsOpen(false)}
car={car}
/>
</div>
);
};
export default CarCard;
模态(车辆详细信息):
const CarDetails: React.FC<CarDetailsProps> = ({ isOpen, closeModal, car }) => (
<>
<Transition appear show={isOpen} as={Fragment} data-testid="modal">
<Dialog as="div" className="relative z-10" onClose={closeModal}>
<Transition.Child
as={Fragment}
enter="ease-out duration-300"
enterFrom="opacity-0"
enterTo="opacity-100"
leave="ease-in duration-200"
leaveFrom="opacity-100"
leaveTo="opacity-0"
>
<div className="fixed inset-0 bg-black bg-opacity-25" />
</Transition.Child>
<div className="fixed inset-0 overflow-y-auto">
<div className="flex min-h-full items-center justify-center p-4 text-center">
<Transition.Child
as={Fragment}
enter="ease-out duration-300"
enterFrom="opacity-0 scale-95"
enterTo="opacity-100 scale-100"
leave="ease-out duration-300"
leaveFrom="opacity-100 scale-100"
leaveTo="opacity-0 scale-95"
>
<Dialog.Panel className="relative w-full max-w-lg max-h-[90vh] overflow-y-auto transform rounded-2xl bg-white p-6 text-left shadow-xl transition-all flex flex-col gap-5">
<button
type="button"
className="absolute top-2 right-2 z-10 w-fit p-2 bg-primary-blue-100 rounded-full"
onClick={closeModal}
>
<Image
src="/close.svg"
alt="close"
width={20}
height={20}
className="object-contain"
/>
</button>
<div className="flex-1 flex flex-col gap-3">
<div className="relative w-full h-40 bg-pattern bg-cover bg-center rounded-lg">
<Image
src={generateCarImageUrl(car)}
alt="car model"
fill
priority
className="object-contain"
/>
</div>
<div className="flex gap-3">
<div className="flex-1 relative w-full h-24 bg-primary-blue-100 rounded-lg">
<Image
src={generateCarImageUrl(car, "29")}
alt="car model"
fill
priority
className="object-contain"
/>
</div>
<div className="flex-1 relative w-full h-24 bg-primary-blue-100 rounded-lg">
<Image
src={generateCarImageUrl(car, "33")}
alt="car model"
fill
priority
className="object-contain"
/>
</div>
<div className="flex-1 relative w-full h-24 bg-primary-blue-100 rounded-lg">
<Image
src={generateCarImageUrl(car, "13")}
alt="car model"
fill
priority
className="object-contain"
/>
</div>
</div>
</div>
<div className="flex-1 flex flex-col gap-2">
<h2 className="font-semibold text-xl capitalize">
{car.make} {car.model}
</h2>
<div className="mt-3 flex flex-wrap gap-4">
{Object.entries(car).map(([key, value]) => (
<div
className="flex justify-between gap-5 w-full text-right"
key={key}
>
<h4 className="text-grey capitalize">
{key.split("_").join(" ")}
</h4>
<p className="text-black-100 font-semibold">{value}</p>
</div>
))}
</div>
</div>
</Dialog.Panel>
</Transition.Child>
</div>
</div>
</Dialog>
</Transition>
</>
);
export default CarDetails;
我试过了,但是modalElement
在这里是null。另外,如果我在userEvent.click
前面添加await
,它会抛出错误:Error: Uncaught [ReferenceError: ResizeObserver is not defined]
单元测试:
it("opens car details modal when 'View More' button is clicked", () => {
render(<CarCard car={mockCar} />);
const viewMoreBtn = screen.getByText("View More");
userEvent.click(viewMoreBtn);
const modalElement = screen.queryByTestId("modal");
expect(modalElement).toBeInTheDocument();
});
1条答案
按热度按时间fnx2tebb1#
await
ing foruserEvent
需要从jest v14开始,所以如果你的jest是v14或更新版本,那么你做得对。由于错误是关于
ResizeOberserve not defined
的,我假设您正在使用某种类型的库来启动它。在这种情况下,我们可以通过以下方式来模拟ResizeOberserve
,使jest稍微更快乐一些:根据提供的信息,这只是一个猜测。希望有帮助。