如何模拟 Material UI Slider 上的值变化?

Posted

技术标签:

【中文标题】如何模拟 Material UI Slider 上的值变化?【英文标题】:How do I simulate a value change on a Material UI Slider? 【发布时间】:2020-02-04 08:06:57 【问题描述】:

我正在尝试通过模拟 Material UI 滑块上的更改值来通过 React Hooks (useState) 测试状态更改,因为这会调用我的钩子状态更新函数。然后,我尝试通过检查页面上显示的文本来验证更改。我觉得我已经接近了,不再有语法错误对我大喊大叫,但似乎没有发生变化。

我尝试了多种不同的选择器,发现大多数在线用户都在导入他们的 Material UI 元素并使用导入的项目作为选择器。我已经尝试过使用和不使用 .as(0),值 500 作为字符串和数字,以及其他变体。

我的滑块的 onChange 方法直接使用 e.target.value 调用我的钩子状态更新方法以设置为新的状态值(并且在实际应用中一切正常)。

我可以尝试其他任何想法吗?或者也许还有另一种更好的方法来测试使用 React 钩子改变状态?

import ReactDOM from 'react-dom';
import App from './App';
import  createMount  from '@material-ui/core/test-utils';
import Slider from "@material-ui/core/Slider";

describe('App', () => 
  let mount;

  beforeEach(() => 
    mount = createMount();
  );

  afterEach(() => 
    mount.cleanUp();
  );


  it('updates the volts displayed when the slider value changes', () => 
    const wrapper = mount(<App />);
    wrapper.find(Slider).at(0).simulate('change',  target:  value: 500  );
    expect(wrapper.find('.volts-screen').text()).toEqual('0.500');
  )

```



ERROR


expect(received).toEqual(expected) // deep equality

    Expected: "0.500"
    Received: "0.000"

【问题讨论】:

请添加您的组件代码。 感谢您的留言。我最终弄清楚了,并会编辑我的帖子,以防其他人正在寻找相同问题的答案。 【参考方案1】:

终于弄明白了。我从材料核心导入了滑块(以与我的组件中相同的方式),然后我在我的 wrapper.find 中使用了导入的元素,并使用 target: value: 500 的第二个参数模拟了一个变化。

一开始我认为这不起作用,但我意识到因为在我的例子中效果是更新我的异步组件状态,我需要添加一个 setTimeout 以确保在我的检查运行之前捕获更新。

在其他 Material UI 元素上看到了一些类似的指导,但没有意识到滑块会如此相似。将把它留在这里,以防万一其他可怜的人正在互联网上搜索“滑块”相关的信息;)

//imported the element as below
import Slider from "@material-ui/core/Slider";

// found in wrapper using that element and simulated change with target value on timeout
it('updates the volts displayed when the slider value changes', () => 
    const wrapper = mount(<App />);
    wrapper.find(Slider).at(0).simulate('change',  target:  value: 500  );
    setTimeout(() => expect(wrapper.find('.volts-screen').text()).toEqual('0.500'), 0);
  )

【讨论】:

恐怕这可能不是一个合法的解决方案。似乎无论您在 setTimeout 中放入什么,测试都会通过。所以这个应该打开备份。【参考方案2】:

仅用于一般知识: 设置值并不仅仅与组件(即上下文)交互:

sliderToFind
    .prop("children")[1]
    .props.ownerState.onChangeCommitted(null, YOUR_VALUE);

  sliderToFind.prop("children")[1].props.ownerState.value = YOUR_VALUE;

这是更改值并触发道具 onChangeCommitted(或其他,即 onChange)

【讨论】:

以上是关于如何模拟 Material UI Slider 上的值变化?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Material-UI 网格列表模拟引导网格

Material-UI 无法导入滑块

用玩笑模拟material-ui选择组件

酶不模拟 React Material-UI v1 上的更改事件 - 选择组件

膨胀类 com.google.android.material.slider.Slider 时出错

如何在 Material-ui 中的 onFocus 上隐藏 Autocomplete 的标签?