gpt4 book ai didi

reactjs - 使用 @testing-library/react 测试 Material ui slider

转载 作者:行者123 更新时间:2023-12-03 09:28:07 37 4
gpt4 key购买 nike

您好,我正在尝试测试一个使用 Material-UI 创建的 Slider 组件,但我无法将测试转到 pass。 .我想使用 fireEvent 测试值的变化。与 @testing-library/react .我一直在关注这篇文章以正确查询 DOM,但我无法获得正确的 DOM 节点。
提前致谢。
<Slider />组件

// @format
// @flow

import * as React from "react";
import styled from "styled-components";
import { Slider as MaterialUISlider } from "@material-ui/core";
import { withStyles, makeStyles } from "@material-ui/core/styles";
import { priceRange } from "../../../domain/Search/PriceRange/priceRange";

const Wrapper = styled.div`
width: 93%;
display: inline-block;
margin-left: 0.5em;
margin-right: 0.5em;
margin-bottom: 0.5em;
`;

// ommited code pertaining props and styles for simplicity

function Slider(props: SliderProps) {
const initialState = [1, 100];
const [value, setValue] = React.useState(initialState);

function onHandleChangeCommitted(e, latestValue) {
e.preventDefault();
const { onUpdate } = props;
const newPriceRange = priceRange(latestValue);
onUpdate(newPriceRange);
}

function onHandleChange(e, newValue) {
e.preventDefault();
setValue(newValue);
}

return (
<Wrapper
aria-label="range-slider"
>
<SliderWithStyles
aria-labelledby="range-slider"
defaultValue={initialState}
// getAriaLabel={index =>
// index === 0 ? "Minimum Price" : "Maximum Price"
// }
getAriaValueText={valueText}
onChange={onHandleChange}
onChangeCommitted={onHandleChangeCommitted}
valueLabelDisplay="auto"
value={value}
/>
</Wrapper>
);
}

export default Slider;
Slider.test.js
// @flow

import React from "react";
import { cleanup,
render,
getAllByAltText,
fireEvent,
waitForElement } from "@testing-library/react";
import "@testing-library/jest-dom/extend-expect";

import Slider from "../Slider";


afterEach(cleanup);

describe("<Slider /> specs", () => {

// [NOTE]: Works, but maybe a better way to do it ?
xdescribe("<Slider /> component aria-label", () => {

it("renders without crashing", () => {
const { container } = render(<Slider />);
expect(container.firstChild).toBeInTheDocument();
});
});

// [ASK]: How to test the event handlers with fireEvent.
describe("<Slider /> props", () => {

it("display a initial min value of '1'", () => {
const renderResult = render(<Slider />);
// TODO
});

it("display a initial max value of '100'", () => {
const renderResult = render(<Slider />);
// TODO
});

xit("display to values via the onHandleChangeCommitted event when dragging stop", () => {
const renderResult = render(<Slider />);
console.log(renderResult)
// fireEvent.change(renderResult.getByText("1"))
// expect(onChange).toHaveBeenCalled(0);
});

// [NOTE]: Does not work, returns undefined
xit("display to values via the onHandleChange event when dragging stop", () => {
const renderResult = render(<Slider />);

console.log(renderResult.container);

const spanNodeWithAriaAttribute = renderResult.container.firstChild.getElementsByTagName("span")[0].getAttribute('aria-label')
expect(spanNodeWithAriaAttribute).toBe(/range-slider/)
});
});

// [ASK]: Works, but a snapshot is an overkill a better way of doing this ?
xdescribe("<Slider /> snapshot", () => {

it("renders without crashing", () => {
const { container } = render(<Slider />);
expect(container.firstChild).toMatchSnapshot();
});
});
});

最佳答案

经过几个小时的斗争后,我能够解决与测试 MUI slider 相关的案例

这真的取决于你需要如何测试你的,在我的情况下,我必须检查标签文本内容是否在使用 marks 单击标记后发生变化 slider Prop 。

问题

1) slider组件根据元素 getBoundingClientRect 计算返回值和 MouseEvent
2) 如何查询slider并触发事件。

3)JSDOM对读取元素实际高度和宽度的限制导致问题1

解决方案

1) 模拟getBoundingClientRect也应该解决问题3

2) 将测试 ID 添加到 slider 并使用使用 fireEvent.mouseDown(contaner, {....})

const sliderLabel = screen.getByText("Default text that the user should see")

// add data-testid to slider
const sliderInput = screen.getByTestId("slider")

// mock the getBoundingClientRect
sliderInput.getBoundingClientRect = jest.fn(() => {
return {
bottom: 286.22918701171875,
height: 28,
left: 19.572917938232422,
right: 583.0937919616699,
top: 258.22918701171875,
width: 563.5208740234375,
x: 19.572917938232422,
y: 258.22918701171875,
}
})

expect(sliderInput).toBeInTheDocument()

expect(sliderLabel).toHaveTextContent("Default text that the user should see")
await fireEvent.mouseDown(sliderInput, { clientX: 162, clientY: 302 })
expect(sliderLabel).toHaveTextContent(
"New text that the user should see"
)

关于reactjs - 使用 @testing-library/react 测试 Material ui slider ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58856094/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com