admin管理员组文章数量:1394990
I have a unit testing coverage report for a ponent MyCheckbox.js.
coverage
How do I test the onCheckmarkPress() function in MyCheckbox.js?
Here is the implementation of MyCheckbox.js:
import * as React from 'react';
import { Pressable, StyleSheet } from 'react-native';
import { Ionicons } from '@expo/vector-icons';
import { useState } from 'react';
/**
*
* @param {() => void} props.onUpdate called when checkbox is pressed
* @return {JSX.Element}
* @constructor
*/
const MyCheckbox = (props) => {
const [checked, onChange] = useState(false);
function onCheckmarkPress() {
onChange((prev) => {
let checked = !prev;
props.onUpdate(checked);
return checked;
});
}
return (
<Pressable
style={[styles.checkboxBase, checked && styles.checkboxChecked]}
onPress={onCheckmarkPress}
>
{checked && <Ionicons name="checkmark" size={24} color="black" />}
</Pressable>
);
};
const styles = StyleSheet.create({
checkboxBase: {
width: 35,
height: 35,
justifyContent: 'center',
alignItems: 'center',
borderRadius: 4,
borderWidth: 2,
borderColor: 'white',
backgroundColor: 'white',
},
checkboxChecked: {
backgroundColor: '#C4C4C4',
},
});
export default MyCheckbox;
I have a unit testing coverage report for a ponent MyCheckbox.js.
coverage
How do I test the onCheckmarkPress() function in MyCheckbox.js?
Here is the implementation of MyCheckbox.js:
import * as React from 'react';
import { Pressable, StyleSheet } from 'react-native';
import { Ionicons } from '@expo/vector-icons';
import { useState } from 'react';
/**
*
* @param {() => void} props.onUpdate called when checkbox is pressed
* @return {JSX.Element}
* @constructor
*/
const MyCheckbox = (props) => {
const [checked, onChange] = useState(false);
function onCheckmarkPress() {
onChange((prev) => {
let checked = !prev;
props.onUpdate(checked);
return checked;
});
}
return (
<Pressable
style={[styles.checkboxBase, checked && styles.checkboxChecked]}
onPress={onCheckmarkPress}
>
{checked && <Ionicons name="checkmark" size={24} color="black" />}
</Pressable>
);
};
const styles = StyleSheet.create({
checkboxBase: {
width: 35,
height: 35,
justifyContent: 'center',
alignItems: 'center',
borderRadius: 4,
borderWidth: 2,
borderColor: 'white',
backgroundColor: 'white',
},
checkboxChecked: {
backgroundColor: '#C4C4C4',
},
});
export default MyCheckbox;
This is how I attempt the test case:
import React from 'react'
import MyCheckbox from '../MyCheckbox';
import {fireEvent, render, screen} from "@testing-library/react-native";
import '@testing-library/jest-dom';
it("works", () => {
const onUpdateMock = jest.fn();
render(<MyCheckbox onUpdate={onUpdateMock} />);
expect(onUpdateMock).toHaveBeenCalledTimes(0);
expect(screen.queryByTestId("checkIcon")).toBeNull();
const pressable = screen.getByRole("pressable");
fireEvent.press(pressable);
expect(onUpdateMock).toHaveBeenCalledTimes(1);
expect(screen.queryByTestId("checkIcon")).toBeInTheDocument(); // check that the icon is rendered
});
However, I am getting the error "Unable to find an element with accessibilityRole: pressable". And will this cover the red lines marked in the coverage report?
Share Improve this question edited Oct 13, 2022 at 0:30 YPZ404 asked Oct 11, 2022 at 4:17 YPZ404YPZ404 931 gold badge1 silver badge8 bronze badges1 Answer
Reset to default 3You should test the behaviour of your ponent, so it would look sth like this:
- Render the ponent
- Find the
Pressable
ponent - Make sure that
check
icon is not displayed - emulate the
click
event onPressable
ponent or other event (touch?) it responds to - Check if
check
icon is displayed
This kind of test will give you the coverage and the functionality tested.
Please provide the Pressable
source if you need more detailed answer, it is hard to tell if it is button or some other implementation.
You can use the React Testing Library to achieve all of above steps.
Assuming your MyCheckbox
works like this:
const MyCheckbox = (props) => {
const [checked, onChange] = React.useState(false);
const onCheckmarkPress = () => {
onChange((prev) => {
let checked = !prev;
props.onUpdate(checked);
return checked;
})
}
return (
<button onClick={onCheckmarkPress}>
{checked && <IonIcon data-testid="checkIcon" name="checkmark" />}
</button>
);
};
You could test it like this:
import { fireEvent, render, screen } from "@testing-library/react";
import MyCheckBox from "../MyCheckbox";
it("should work", () => {
const onUpdateMock = jest.fn();
render(<MyCheckBox onUpdate={onUpdateMock} />);
expect(screen.queryByTestId("checkIcon")).not.toBeInTheDocument(); // check that the icon is not rendered
const btn = screen.getByRole("button"); // get the button (pressable)
fireEvent.click(btn); // click it
expect(screen.getByTestId("checkIcon")).toBeInTheDocument(); // check that the icon is displayed
expect(onUpdateMock).toHaveBeenCalledTimes(1); // make sure that the onUpdate function that was passed via props was clicked
});
本文标签: javascriptHow do I test a function inside a component by using jestStack Overflow
版权声明:本文标题:javascript - How do I test a function inside a component by using jest? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744109934a2591243.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论