当前位置: 首页 > 知识库问答 >
问题:

如何使用酶对材料-ui 文本字段进行单元测试?

龙飞
2023-03-14

我还在学习酶和材料的反应。

我有一个包含Material-ui的TextField的组件,我想对以下情况进行单元测试。

  1. 当用户在屏幕上的文本字段上输入字符串“123”时,文本字段应将“错误”设置为“true”,并显示消息“错误的名称格式”。

成分

import React, { useState } from "react";
import TextField from "@material-ui/core/TextField";
import Grid from "@material-ui/core/Grid";

export const NameTextField = props => {
  const { onStateChange } = props;
  const [state, setState] = useState({
    errors: [],
    onChange: false,
    pristine: false,
    touched: false,
    inProgress: false,
    value: {
      name: ""
    }
  });
  const handleOnBlur = async event => {
    const inputStringLC = String(event.target.value).toLowerCase();

    // First verify the email is in good format
    if (inputStringLC !== "123") {
      // If true, verify username is available
      const updatedState = {
        ...state,
        touched: true,
        pristine: true,
        value: {
          name: inputStringLC
        },
        inProgress: false,
        errors: []
      };
      setState(updatedState);
      onStateChange(updatedState);
    } else {
      const updatedState = {
        ...state,
        touched: true,
        pristine: false,
        value: {
          name: inputStringLC
        },
        errors: ["Wrong Name format."]
      };
      setState(updatedState);
      onStateChange(updatedState);
    }
  };

  return (
    <Grid container spacing={1}>
      <Grid item xs={12}>
        <TextField
          variant="outlined"
          required
          fullWidth
          id="name"
          label="Name"
          error={state.errors.length > 0}
          helperText={state.errors.length > 0 ? state.errors[0] : null}
          name="name"
          autoComplete="name"
          margin="dense"
          onBlur={handleOnBlur}
        />
      </Grid>
    </Grid>
  );
};

export default NameTextField;

单元测试

import React from 'react';
import { configure, shallow, mount } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import NameTextField from './NameTextField';
import TextField from '@material-ui/core/TextField';
import { createShallow } from '@material-ui/core/test-utils';


configure({adapter: new Adapter()});

describe('<NameTextField />', ()=> {
  let shallow;

  beforeAll(() => {
    shallow = createShallow();
  });
  let wrapper;
  beforeEach(()=>{
    wrapper =  shallow(<NameTextField />);
  });

  it('should render one <TextField /> element.', ()=>{
    expect(wrapper.find(TextField)).toHaveLength(1);
  });


  it('should show error when entered', ()=>{
    wrapper.find('#name').simulate('change', {target: {value: '123'}});
    expect(wrapper.find("#name").props().error).toBe(
        true);
    expect(wrapper.find("#name").props().helperText).toBe(
        'Wrong Name format.');
  });


});

我得到以下错误。错误:期望(收到). toBe(期望)//Object.is相等

预期:true收到:false

我做错了什么吗?

共有1个答案

范高刚
2023-03-14

我通过这种方式解决了这个问题。为处于相同情况的人发布解决方案。

  1. 我试过使用mount,但它变得非常复杂,因为用户界面有很多嵌套样式的组件。所以我用浅层代替。
import React from 'react';
import {configure} from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import NameTextField from './NameTextField';
import TextField from '@material-ui/core/TextField';
import {createShallow} from '@material-ui/core/test-utils';
import {act} from 'react-dom/test-utils';

configure({adapter: new Adapter()});

describe('<NameTextField />', () => {
  let shallow;

  beforeAll(() => {
    shallow = createShallow();
  });
  let wrapper;
  beforeEach(() => {
    wrapper = shallow(<NameTextField onStateChange={handleStateChange}/>);
  });

  const handleStateChange = updatedState => {
  };

  it('should show no error when first entered', () => {
    expect(wrapper.find(TextField).at(0).props().error).toBe(
        false);
    expect(wrapper.find(TextField).at(0).props().helperText).toBe(
        null);
  });

  it('should show error when nothing entered', () => {
    act(() => {
      wrapper.find(TextField).at(0).simulate('blur', {target: {value: '123'}});
    });
    wrapper.update();
    expect(wrapper.find(TextField).at(0).props().error).toBe(
        true);
    expect(wrapper.find(TextField).at(0).props().helperText).toBe(
        "Wrong Name format.");
  });

  it('should show no error when correctly entered', () => {
    act(() => {
      wrapper.find(TextField).at(0).simulate('blur', {target: {value: 'James'}});
    });
    wrapper.update();
    expect(wrapper.find(TextField).at(0).props().error).toBe(
        false);
    expect(wrapper.find(TextField).at(0).props().helperText).toBe(
        null);
  });

});

希望这有帮助。感谢所有帮助过我的人。

 类似资料:
  • 我想测试一些类。那个类有@resource的布尔字段。我不能模拟这个字段。因此,它的测试失败了一些错误。如果有人能告诉我如何测试这个类。 这是我的java类 我试图模拟“ReadOnlyMode”字段,但它给出了错误。 org.Mockito.exceptions.base.mockitoException:不能mock/spy类java.lang.Boolean Mockito不能mock/sp

  • 问题内容: 我目前正在工作的公司正在使用Selenium进行统一测试我们的用户界面。您使用什么对WebUI进行单元测试,以及如何找到它? 问题答案: 我们在我的工作地点使用Watin,因为我们是.net商店,所以此解决方案很有意义。实际上,我们从Watir(原始的ruby实现)开始,然后进行切换。到目前为止,这对我们来说是一个很好的解决方案

  • 问题内容: 我在玩Material- ui。我使用路线实现了LeftNav,但找不到找到IconMenu或Menu来处理链接或路线的方法。任何人都可以为我指出一个好的资源/教程吗?该文档不足,并且两个组件似乎都不像LeftNav那样支持’menuItems’作为属性。 问题答案: 2016年12月编辑: 该道具已 弃用 ,您会收到警告: 因此,只需删除道具: 这是示例存储库,以及此处的实时演示。

  • 我无法使与一起工作。 我希望能够右键单击表中的任何位置(行,td)并显示上下文菜单。这部分工作。 但我也希望能够连续右键单击表中的其他位置,并始终显示上下文菜单的光标位置。这不起作用。当前,您必须单击“离开”关闭菜单,然后再次右键单击以重新打开菜单。 在Material UI演示中, https://material-ui.com/components/menus/#context-menu操作正

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样:

  • 我一直在试图找出如何样式的材料ui TextField组件。 我的类创建如下: 我的问题是,我似乎无法让文本字段的颜色变成白色。我似乎能够将样式应用于整个文本字段(因为宽度样式工作等)...但是我认为问题是我没有将样式应用到链的更下游和实际输入中。 我曾试图寻找其他关于传递输入道具的答案,但没有成功。 我已经尽了我最大的努力,但我想我需要问问是否有人知道我做错了什么。 它现在看起来是什么样子