React Native Testing Library를 사용하여 타사 React Native 구성 요소를 테스트하는 방법
press
, click
, scroll
, 전체 9야드.하지만 피와 땀과 눈물을 흘리며 시행착오를 통해 작동하는 일반적인 접근 방식을 알아냈고 다른 사람들의 스트레스를 덜어주기 위해 공유하고 싶었습니다.
react-native-picker-select
패키지의 구성 요소에 대한 간단한 테스트를 보여줌으로써 접근 방식을 설명하겠습니다.트리에서 구성 요소 찾기
대부분의 테스트의 첫 번째 단계는 관련된 구성 요소를 찾는 것입니다. 문제는 모든 타사 구성 요소가
testID
와 같은 소품을 직접 설정할 수 있는 옵션을 제공하지 않기 때문에 창의력을 발휘해야 했습니다.<View>
태그 쌍으로 구성 요소를 래핑하고 <View>
와 같이 부모 testID
에 소품을 설정하는 것으로 시작합니다. 그런 다음 <View>
의 자식에 액세스하여 구성 요소를 찾을 수 있습니다. 다음은 시연할 몇 가지 샘플 코드입니다.//CustomPickerSelect.jsx
import React from 'react';
import { View } from 'react-native';
import RNPickerSelect from 'react-native-picker-select';
const CustomPickerSelect = () => {
return (
<View testID='picker-select-parent'>
<RNPickerSelect
onValueChange={() => { }}
items={[]}
/>
</View>
)
}
export default CustomPickerSelect;
//CustomPickerSelect.test.js
import { render } from '@testing-library/react-native';
import CustomPickerSelect from './CustomPickerSelect';
test('Testing CustomPickerSelect', () => {
const { getByTestId } = render(<CustomPickerSelect />)
const picker = getByTestId("picker-select-parent").children[0];
})
picker
는 렌더링된 트리에서 타사 구성 요소ReactTestInstance
를 나타내는 RNPickerSelect
입니다.발생 이벤트
타사 구성 요소의 경우 응답을 유도하는 이벤트(또는 이벤트 처리기)의 이름은 일반적으로 해당 소품에 나열됩니다. 소품은 일반적으로 문서에서 사용할 수 있지만 항상 그런 것은 아닙니다. 문서가 오래되었을 수도 있으므로
.props
의 ReactTestInstance
속성을 기록하여 사용 가능한 소품을 직접 확인하는 데 도움이 됩니다. 지금 해보자:import { render } from '@testing-library/react-native';
import CustomPickerSelect from './CustomPickerSelect';
test('Testing CustomPickerSelect', () => {
const { getByTestId } = render(<CustomPickerSelect />)
const picker = getByTestId("picker-select-parent").children[0];
console.log("picker props: ", picker.props)
})
다음은 로그의 스크린샷입니다.
우리가 사용할 주요 도구에 대해 논의하기 위해 잠시 우회해 봅시다:
fireEvent
. React Native Testing Library에서 제공하는 fireEvent
메서드의 구문은 다음과 같습니다.fireEvent(element: ReactTestInstance, eventName: string, ...data: Array<any>): void
data
매개변수의 의미가 명확하지 않은 경우 이는 실제로 호출되는 이벤트 핸들러에 전달될 인수를 나타냅니다.문제는
eventName
인수에 사용할 올바른 값을 결정하는 것입니다. 여기에서 이전에 기록된 ReactTestInstance
에 대한 소품을 참조합니다. 이벤트 핸들러는 일반적으로 "on-"접두사가 붙습니다(예: onPress
).ReactTestInstance
에 대한 이벤트 핸들러는 다음과 같습니다.CustomPickerSelect.jsx
이벤트 처리기 테스트를 용이하게 하기 위해 onValueChange
구성 요소에 몇 가지를 추가해 보겠습니다.import React, { useState } from 'react';
import { View } from 'react-native';
import RNPickerSelect from 'react-native-picker-select';
const CustomPickerSelect = () => {
const [value, setValue] = useState("")
return (
<View testID='picker-select-parent'>
<RNPickerSelect
value={value}
onValueChange={(newValue) => { setValue(newValue) }}
items={[]}
/>
</View>
)
}
export default CustomPickerSelect;
이제
onValueChange
이벤트 핸들러를 호출하고 모든 것이 예상대로 작동하는지 확인합니다.import { render, fireEvent } from '@testing-library/react-native';
import CustomPickerSelect from './CustomPickerSelect';
test('Testing CustomPickerSelect', () => {
const { getByTestId } = render(<CustomPickerSelect />)
const picker = getByTestId("picker-select-parent").children[0];
fireEvent(picker, 'onValueChange', "A");
expect(picker.props.value).toBe("A");
})
일반적으로 구현 세부 사항에 대해 주장하는 것은 권장되지 않지만 이를 수행하는 방법을 아는 것은 나쁠 수 없습니다 ;).
다른 테스트를 수행하려는 경우 필요한 변경을 수행할 수 있습니다. 예를 들어 다음은
CustomPickerSelect
구성 요소에 대한 prop으로 전달된 콜백 함수가 호출되는지 테스트하는 코드입니다.import React, { useState } from 'react';
import { View } from 'react-native';
import RNPickerSelect from 'react-native-picker-select';
const CustomPickerSelect = ({ setValueCallback }) => {
const [value, setValue] = useState("")
return (
<View testID='picker-select-parent'>
<RNPickerSelect
value={value}
onValueChange={(newValue) => {
setValue(newValue);
setValueCallback(newValue);
}}
items={[]}
/>
</View>
)
}
export default CustomPickerSelect;
import { render, fireEvent } from '@testing-library/react-native';
import CustomPickerSelect from './CustomPickerSelect';
test('Testing CustomPickerSelect', () => {
const mockCallback = jest.fn();
const { getByTestId } = render(
<CustomPickerSelect
setValueCallback={mockCallback}
/>
)
const picker = getByTestId("picker-select-parent").children[0];
fireEvent(picker, 'onValueChange', "A");
expect(mockCallback).toHaveBeenCalled();
})
지금은 그게 다입니다. 도움이 되었다면 읽어주시고 친구와 공유해 주셔서 감사합니다.
출처
https://www.npmjs.com/package/react-native-picker-select
https://callstack.github.io/react-native-testing-library/docs/api#fireevent
Reference
이 문제에 관하여(React Native Testing Library를 사용하여 타사 React Native 구성 요소를 테스트하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/hmcodes/how-to-test-third-party-react-native-components-using-react-native-testing-library-g58텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)