【问题标题】:Testing a React Component with Jest用 Jest 测试一个 React 组件
【发布时间】:2019-03-29 19:11:09
【问题描述】:

我在 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);
});

提前致谢。

【问题讨论】:

    标签: javascript reactjs unit-testing jestjs react-component


    【解决方案1】:

    代码:

    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)
    

    【讨论】:

    • 哇!惊人的答案!非常感谢。
    • 您的代码仍然不适合我,可能是一些技术问题。我们可以转到有关此的聊天吗?
    • 也许,设置有问题?
    • 可能已经设置好了。
    猜你喜欢
    • 2014-10-21
    • 2017-02-12
    • 1970-01-01
    • 2015-07-19
    • 2021-12-10
    • 2020-08-12
    • 2018-08-20
    • 2018-02-15
    • 2019-02-24
    相关资源
    最近更新 更多