2017-01-25 29 views
0

私は反応クラス法を酵素で試験しようとしています。メソッドは入力の変更を処理し、状態を設定する必要があります。私は「プロパティを読み取ることができません 'というエラーを取得していますSETSTATE'反応成分内の試験方法

class LoginPage extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      username: '', 
      password: '' 
     }; 

     this.handleChange = this.handleChange.bind(this); 

     ... 
    } 

    handleChange(event) { 
     this.setState({[event.target.name]: event.target.value}) 
    } 

    ... 

    return(
     ... 
     <TextField name='username' onChange={this.handleChange} /> 
    ) 

test.js

it('handles change',() => { 
    const spy = sinon.spy(LoginPage.prototype, 'handleChange'); 
    const _wrapper = shallow(<LoginPage />); 

    spy({ 
      event: { 
       target: { 
        name: 'username', 
        value: 'username' 
       } 
      } 
     } 
    ); 

    expect(_wrapper.state().username).to.equal('username'); 
}) 

})

未定義component.jsの。

+0

この 'TextField name = 'username' onChange = {(e)=> this.handleChange(e)} />'を試してみると、レンダリングメソッドはどこですか? – prosti

+0

私は 'TypeError:既にwrappedされているhandleChangeをラップしようとしました.'でも、スパイとテストの終わりにrestore()を実行しました。私はそれが正規のコードであるときにテストを動作させるためにコンポーネントを変更したくないと思う。 '...'が表すコードの一部を切り捨てて、レンダリングしてコンポーネントを細かくレンダリングします。 – Mantis

+0

コンポーネントが実際に動作しています。あなたはテストを統合するときに問題があります。右? – prosti

答えて

0

私が答える前に、テストを書くのが簡単になる(そしてスパイ/スタブを使いやすくする)いくつかの方法があります。たとえば、 "onChange" propをコンポーネントに渡して、その小道具を使用することができます。

だから、それに答えて、何かに「バインド」されていない関数を呼び出しています。あなたのthis(あなたが作成したスパイは内側)undefinedで、あなたが言うエラー抱えている理由です:

:それを回避するために

Cannot read property 'setState' of undefined

一つの簡単な方法は、「バインドさ」機能を呼び出すことですが

Just notice that you will need to import "TextField" component, in order to execute "find" correctly

import TextField from '../path/to/TextField.jsx'; 

it('handles change',() => { 
    const _wrapper = shallow(<LoginPage />); 

    _wrapper.find(TextField).simulate('change', { 
     target: { 
      name: 'username', 
      value: 'username', 
     }, 
    }); 

    expect(_wrapper.state().username).to.equal('username'); 
}); 

この方法で、simulate('change')は、渡されたパラメータを持つonChangeを呼び出します。この場合、onChangethisと正しくバインドされたhandleChangeを呼び出します。

関連する問題