하위 구성요소가 렌더링되었는지 테스트하려면 어떻게 해야 합니까?
효소에서는 다음과 같이 하위 구성요소의 존재를 확인할 수 있습니다.
expect(wrapper.find(ChildComponent)).toHaveLength(1)
리액트 테스트 라이브러리의 이 테스트와 동등한 것은 무엇입니까?제가 찾은 모든 온라인 예제는 돔 요소를 찾는 매우 간단한 테스트에 불과합니다.자녀 컴포넌트를 렌더링하는 예제는 포함되어 있지 않습니다.하위 구성 요소를 찾으려면 어떻게 해야 합니까?
하위 구성요소가 렌더링되었는지 여부를 확인하지 마십시오. 하위 구성요소는 구현 세부 정보를 테스트하는 중이므로(어느 테스트 라이브러리에서 렌더링하지 않는지를) 확인해야 합니다.
자녀 컴포넌트의 일부 텍스트가 렌더링되었는지 확인하거나 자녀 래퍼 요소에 data-testid를 지정한 후 @testing-library/jest-dom에서 .toBeInTheDocument를 사용할 수 있습니다.
expect(getByText(/some text/i)).toBeInTheDocument();
또는
expect(getByTestId('your-test-id')).toBeInTheDocument();
갱신: 예
// Child Component
function ChildComponent() {
return <div>Child Element</div>;
};
// Parent
export default function Parent() {
return (
<div className="App">
<ChildComponent />
</div>
);
}
테스트:
import { render } from "@testing-library/react";
import "@testing-library/jest-dom/extend-expect";
import Parent from "./App";
test("test child component", () => {
const { getByText } = render(<Parent />);
expect(getByText(/child element/i)).toBeInTheDocument();
});
@testing-library/jest-dom 라이브러리를 사용할 수 있습니다.
컴포넌트:
<div role="root">
<div data-testid="parent">
<div data-testid="child">
content
</div>
</div>
</div>
테스트:
import '@testing-library/jest-dom'
import {render} from '@testing-library/react';
describe('My component', () => {
test('should render component2', () => {
const { getByRole, getByTestId } = render(<Component/>);
const root = getByRole('root');
const parent = getByTestId('parent');
const child = getByTestId('child');
expect(root).toContainElement(parent);
expect(parent).toContainElement(child);
expect(child).not.toContainElement(parent); // Pass
expect(child).toContainElement(parent); // Throw error!
});
});
또 다른 해결책은within
에서 기능하다@testing-library/react
라이브러리:
import { within } from '@testing-library/react';
...
expect(within(parent).queryByTestId('child')).not.toBeNull();
import TestRenderer from 'react-test-renderer';
import ItemList from 'components/ItemList';
import LoadingIndicator from 'components/LoadingIndicator';
test('renders loading indication', () => {
const testRenderer = TestRenderer.create(
<ItemList items={[]} isLoading={true}/>
);
const testInstance = testRenderer.root;
testInstance.findByType(LoadingIndicator);
});
'실장 상세 테스트'가 아니라 '로드'가 그 반대라고 생각합니다.인디케이터 컴포넌트는 테스트 케이스를 수리할 필요 없이 수정할 수 있습니다.
돌아온 이래null
요소를 찾을 수 없는 경우 다음 작업을 수행할 수 있습니다.
expect(queryByTestId('test-id-you-provided')).toEqual(null);
expect(queryByTestId('some-other-test-id-you-provided')).not.toEqual(null);
요소를 찾을 수 없는 경우에도 느려집니다.그래서 다음 것도 잘 될 거예요.
getByTestId('test-id-you-provided');
하위 컴포넌트 내에서 텍스트 또는 테스트 ID를 확인하는 것은 구현 세부사항을 테스트하는 것이라고 말한 모든 사용자의 의견에 동의합니다.
그러나 자녀 컴포넌트의 구현 세부사항을 제거하기 위해 조롱을 사용할 수 있습니다.
테스트할 코드:
import { ChildComponent } from 'child-from-somewhere';
export function Parent() {
return (
<div className="App">
<ChildComponent />
</div>
);
}
Child Component가 렌더링되었는지 확인하는 테스트 코드:
import { render } from "@testing-library/react";
import React from "react";
import { Parent } from "./parent";
jest.mock("child-from-somewhere", () => ({
ChildComponent: () => <div data-testid="ChildComponent">ChildComponent</div>,
}));
describe("ChildComponent component", () => {
it("should be in the document", () => {
const { getByTestId } = render(<Parent />);
expect(getByTestId("ChildComponent")).toBeInTheDocument();
});
});
이렇게 하면 테스트는 내부 변경과 무관하게 유지됩니다.ChildComponent
.
언급URL : https://stackoverflow.com/questions/60041468/how-do-i-test-that-a-child-component-is-rendered
'source' 카테고리의 다른 글
한 페이지 웹 사이트에서 jquery ajax를 사용하여 페이지를 로드하는 동안 진행 표시줄 표시 (0) | 2023.03.11 |
---|---|
워드프레스에서 제목으로 투고를 받으려면 어떻게 해야 하나요? (0) | 2023.03.11 |
플럭스 아키텍처에서는 스토어 라이프 사이클을 어떻게 관리합니까? (0) | 2023.03.11 |
SpringBoot 오류: 드라이버 ClassName=driver.jdbc.driver에 등록된 드라이버입니다.OracleDriver를 찾을 수 없습니다. 직접 인스턴스화를 시도합니다. (0) | 2023.03.11 |
지정 시 패키지에 "프록시"가 있습니다.json은 문자열이어야 합니다. (0) | 2023.03.11 |