我如何测试具有儿童组件中所有文本字段的反应应用程序?

我如何测试具有儿童组件中所有文本字段的反应应用程序?

问题描述:

我已经创建了一个反应应用程序,它具有父级中的所有逻辑(如onchange函数)以及子组件中的所有html呈现。我如何测试具有儿童组件中所有文本字段的反应应用程序?

为了测试是否正确的状态变化正在发生,我必须输入文本到输入字段并输入值,但唯一的问题是我不知道如何访问子元素,当我在js dom中装入父项。

我应该将逻辑移入子组件吗?还是我应该只测试父组件的功能?

这是从父

render() { 
    if (!this.state.accessTokenEntered) { 
     return <AccessTokenPage _onChange={this._onChange} 
           accessToken={this.state.inputs.accessToken} 
           env={this.state.inputs.env} 
           _onFirstClick={this._onFirstClick}/>; 

,这是孩子

const AccessToken = props =>(
<Layout> 
    <Input name={"accessToken"} displayName={"Access Token"} _onChange={props._onChange} 
      value={props.accessToken}/> 


    <DropDown name={"env"} displayName={"Environment"} _onChange={props._onChange} 
       data={['ppe', 'prod']} multiple={false} 
       value={props.env}/> 

    <br/> 

    <div style={{"textAlign": "center"}}> 
     <input type="button" onClick={props._onFirstClick} className="btn btn-primary" value="Submit"/> 
    </div> 
</Layout> 
); 

,这是孩子的孩子

const Input = props => (
<div className="form-group row"> 
    <label className="col-xs-2 col-form-label">{props.displayName}</label> 

    <div className="col-xs-10"> 
     <input name={props.name} className="form-control" value={props.value} 
       onChange={props._onChange}/></div> 
</div> 
); 

你应该测试你的孩子组成。当模拟文本框的onChange事件时,测试onChange prop是否被调用。这可以通过为onChange prop创建一个模拟或间谍来完成。

示例测试如下所示:

嘲笑道具。

beforeEach(() => { 
    onAdd = jest.fn(); 
    add = TestUtils.renderIntoDocument(<Add onAdd={onAdd} />); 
    }); 

测试,如果模拟方法被称为:

it('Button click calls onAdd',() => { 
    const button = TestUtils.findRenderedDOMComponentWithTag(add, 'button'); 
    const input = TestUtils.findRenderedDOMComponentWithTag(add, 'input'); 
    input.value = 'Name 4'; 
    TestUtils.Simulate.change(input); 
    TestUtils.Simulate.click(button); 
    expect(onAdd).toBeCalledWith(input.value); 
    }); 

我使用的玩笑并作出反应TestUtils。在我的github project中有类似的代码可用于酶。

+0

我可以用间谍测试最低级别的孩子,但我可以测试中级别的组件吗?就像其他组件一样,我发现它很难测试 –