«Не удалось найти элемент с текстом..» во время тестирования реакции

#javascript #reactjs #jestjs #graphql #apollo

#язык JavaScript #реагирует на #jestjs #graphql #аполлон

Вопрос:

У меня есть небольшое приложение React/TypeScript/GraphQL, которое подключается к API, извлекает продукты и отображает их на странице.

Я пытаюсь создать тест, который проверяет , есть ли название продукта в документе после макета GraphQL, с помощью getByText , но я продолжаю получать TestingLibraryElementError: Unable to find an element with the text: iPad 5g. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Я также пытался использовать getByRole (см. Ниже), но это дает мне ошибку TestingLibraryElementError: Unable to find an accessible element with the role "paragraph" and name '/month to month/i'

Есть ли лучший способ сделать это? Как я могу проверить, правильно ли отображено название продукта? Я ценю любую помощь.

ProductCard.test.js

 import React from "react"; import { render, screen } from "@testing-library/react"; import TestRenderer from 'react-test-renderer'; import { MockedProvider } from '@apollo/client/testing'; import ProductCard from "../ProductCard"; import { LOAD_PRODUCTS } from "../GraphQL/Queries"; import '@testing-library/jest-dom';  it('renders ProductCard successfully', async () =gt; {  const productMock = {  request: {  query: LOAD_PRODUCTS,  },  result: {  data: { products: { productName: 'iPad 5g', code: 'i5g', price: 599.99 } },  },  };   const component = TestRenderer.create(  lt;MockedProvider mocks={[productMock]} addTypename={false}gt;  lt;ProductCard displayName={productMock.result.data.products.productName} price={productMock.result.data.products.price} /gt;  lt;/MockedProvidergt;,  );  await new Promise(resolve =gt; setTimeout(resolve, 0));   expect(screen.getByText(`iPad 5g`)).toBeInTheDocument();  // expect(screen.getByRole('paragraph', { name: /iPad 5g/i })).toBeInTheDocument(); });  

Карточка продукта.tsx

 // imports  // ...  // ...  // TypeScript types  // ...  // ...   const ProductCard: React.FClt;Propsgt; = ({ productName, price }) =gt; {   return (  lt;gt;  lt;Typographygt;{productName}lt;/Typographygt;  lt;Typographygt;{price}lt;/Typographygt;  lt;Typographygt;lt;pgt;Great new featureslt;/pgt;lt;/Typographygt;  lt;Buttongt;Buy Nowlt;/Buttongt;  lt;/gt;  ); }  

Ответ №1:

Похоже, вам это не нужно MockedProvider , если вы просто тестируете «тупой» компонент (он же тот, который просто отображает некоторый HTML и не имеет другой логики). Вам это нужно только MockedProvider в том случае , если вы тестируете компонент, который использует useQuery или useMutation , и в этом случае эти крючки вернут указанное вами значение mock.result. Попробуйте полностью удалить MockedProvider и просто визуализируйте компонент с некоторыми реквизитами и посмотрите, поможет ли это.