javascript - 使用 Jest 测试 React 组件

标签 javascript reactjs unit-testing jestjs react-component

我在 React 上启动了一个新的“Hello World”项目,如下所示:

import React, { Component } from 'react';

export class Home extends Component {
    displayName = Home.name

    state = {
        result: 0,
        val1: 0,
        val2: 0,
    }

     handleChangeOne = (event) => {
        this.setState({ val1: event.target.value });
    }

    handleChangeTwo = (event) => {
        this.setState({ val2: event.target.value });
    }

    add = () => {
        this.setState({
            result: parseInt(this.state.val1) + parseInt(this.state.val2) 
        });
    }

 render() {
        return (
            <div>
                <h1>Hello world! The result is: {this.state.result}</h1>

                <input type="text" onChange={this.handleChangeOne} />
                +
                <input type="text" onChange={this.handleChangeTwo} />
                = <br />
                <button onClick={this.add}>Add</button>
            </div>
        );
      }
    }

基本上,用户插入两个数字,当他单击“添加”按钮时,结果将显示在屏幕上。

当我运行该组件时,它似乎可以工作,但我想用 Jest 测试它(也是为了熟悉 Jest)。

我已经安装了 Jest 并查看了他们网站上的所有步骤,但我仍然不确定应该如何编写测试。

在测试中,我想插入两个数字(与用户相同)并检查它是否返回它们的总和。

到目前为止,我创建了一个新文件“Home.test.js”,它是我想要执行的测试的伪代码。

当然,它现在不起作用,但我很想让它起作用。

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { Home } from './Home.js';


it('Returns a sum', () => {
    const home = shallow(<Home />);
    var first_val = Home.state.val1;
    var second_val = Home.state.val2;
    var result = first_val + second_val;
    expect(result).toEqual(Home.state.result);
});

提前致谢。

最佳答案

代码:

it('returns a sum',()=>{
  const home = shallow(<Home />);
  var first_val = home.state().val1;
  var second_val = home.state().val2;
  var result = first_val + second_val;
  expect(result).toBe(0);
  const inputs=home.find('input')
  inputs.at(0).simulate('change',{target: {value: 5 } } )
  inputs.at(1).simulate('change', { target: { value: 8 } })
  home.find('button').simulate('click')
  home.update()
  expect(home.state().result).toBe(13)
})

您可能会发现它很有用。

1.记住要访问状态,您必须像这样调用state()。

home.state().somevalue
Ex:- home.state().val1

2.您已经从这里制作了包装器。

const home = shallow(<Home />);

现在这样访问状态是错误的。

Home.state.val1;// it should be home.state().val1;

3.默认情况下,状态包含默认值。

var first_val = home.state().val1;
var second_val = home.state().val2;
var result = first_val + second_val;
expect(result).toBe(0);//here it is.

4.给字段输入值。首先找到该字段并模拟onchange,如下所示。

const inputs=home.find('input')
inputs.at(0).simulate('change',{target: {value: 5 } } )//observe the object 
inputs.at(1).simulate('change', { target: { value: 8 } })

5.现在要添加这些值,请调用添加按钮。

home.find('button').simulate('click')

6.你的工作还没有完成!别忘了调用它。

home.update()

7.现在检查值

expect(home.state().result).toBe(13)

关于javascript - 使用 Jest 测试 React 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52984757/

相关文章:

javascript - 在html5中创建点击图片的鼠标事件

javascript - JQuery '.load()' 不工作

swift - Firebase 配置失败 - Swift

xml - 标准 XUnit 报告 XML 的引用源是什么

java - 有没有办法测试方法处理并发调用的能力?

javascript - 发布 Blueimp 画廊 Twitter Bootstrap

比较两个值时,JavaScript 似乎评估出无效结果

javascript - 获取变化的单选值 - Reactjs

javascript - 什么时候我们必须使用开玩笑的快照或手动检查?

javascript - 有没有办法在不使用 Next 或 Gatsby 的情况下使 ReactJs SEO 友好?