2016-10-01 3 views
4

コンポーネントでボタンがクリックされたときに、クリックを処理するために作成したメソッドを呼び出すことを確認します。ここに私のコンポーネントである:EnzymeとSinonを使用してReactコンポーネントのテストカスタムメソッドが呼び出されました

import React, { PropTypes, Component } from 'react'; 

class Search extends Component { 

    constructor(){ 
    super(); 
    this.state = { inputValue: '' }; 
    } 

    handleChange = (e) => { 
    this.setState({ inputValue: e.target.value }); 
    } 

    handleSubmit = (e) => { 
    e.preventDefault(); 
    return this.state.inputValue; 
    } 

    getValue =() => { 
    return this.state.inputValue; 
    } 

    render(){ 
    return (
     <form> 
     <label htmlFor="search">Search stuff:</label> 
     <input id="search" type="text" value={this.state.inputValue} onChange={this.handleChange} placeholder="Stuff" /> 
     <button onClick={this.handleSubmit}>Search</button> 
     </form> 
    ); 
    } 
} 

export default Search; 

、ここでは私のテストは

import React from 'react'; 
    import { mount, shallow } from 'enzyme'; 
    import Search from './index'; 
    import sinon from 'sinon'; 

    describe('Search button',() => { 

    it('calls handleSubmit',() => { 
     const shallowWrapper = shallow(<Search />); 
     const stub = sinon.stub(shallowWrapper.instance(), 'handleSubmit'); 
     shallowWrapper.find('button').simulate('click', { preventDefault() {}  }); 
     stub.called.should.be.true(); 
    }); 

    }); 

あるプロパティと呼ばれるコールバック偽きます。私は文法のバリエーションを試してみましたが、おそらく私は何か基本的なものを見逃していると思います。どんな助けでも大歓迎です。

答えて

10

私はシノンにも比較的新しいです。 (あなたが同じようにstub()を使用することができますが)私は一般的にコンポーネント小道具にspy() Sを渡し、そしてそれらをチェックされています:

let methodSpy = sinon.spy(), 
 
    wrapper = shallow(<MyComponent someMethod={methodSpy} />) 
 

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

 
methodSpy.called.should.equal(true)

私はそれが最も簡単だと思うので、私はこれを指摘しますユニットテストコンポーネント(テスト内部メソッドcan be problematic)に方法。

コンポーネントの内部メソッドをテストしようとしているこの例では、これは機能しません。私はthis issueに出くわしましたが、それはあなたを助けるはずです。試してみてください:

it('calls handleSubmit',() => { 
 
    const shallowWrapper = shallow(<Search />) 
 
    let compInstance = shallowWrapper.instance() 
 

 
    let handleSubmitStub = sinon.stub(compInstance, 'handleSubmit'); 
 
    // Force the component and wrapper to update so that the stub is used 
 
    compInstance.forceUpdate() 
 
    shallowWrapper.update() 
 

 
    shallowWrapper.find('button').simulate('click', { preventDefault() {} }); 
 

 
    handleSubmitStub.called.should.be.true(); 
 
});

+0

2番目のコードスニペットは確かに私のテストに合格しません。内部メソッドのテストに関する興味深い記事、私はそれを知らなかった。私は一般的にTDDにはかなり新しいので、もし私がテストすべきものが間違っていれば、おそらく私の理解です。多くのおかげで、私は私の研究に忍耐強くなるでしょう! –

+0

「ユニット」の境界線はどういう意見がありますか、あなたのアプローチは必ずしも間違っているとは思われません。しかし、それは一般的に開催されている意見ですので、私はそれを渡す必要があると思った。あなたのテストの旅をお楽しみください:) – bjudson

+0

多くのおかげで、それは私をたくさん助け、私は酵素レポに多くの問題をチェックしましたが、コンポーネントの内部メソッドでは動作しません。 –

関連する問題