2016-11-11 4 views
0

Reactコンポーネントのasync/Promiseベースのメソッドのテストで誰も助けてくれませんか?たとえば、私は本当に簡単な以下のいる私はそうのようなsinonと非同期メソッドの中で最も模擬可能性が私のテストで今コンポーネント(それが唯一のダミーコードです)Reactで非同期メソッドをテストするには?

import server from './server'; 

class Button extends Component { 
    async handleClick() { 
    if (await canDoSomething()) { 
     const result = await calculateIt(); 
     if (result) { 
     // will be mocked in my unit test 
     await server.sendResultToServer(result); 
     localStorage.setItem('sent', 'true'); 
     } 
     localStorage.setItem('sent', 'false'); 
    } 
    if (localStorage.getItem('sent') === 'true') { 
     // do something 
    } 
    } 

    render() { 
    return <button onClick={this.handleClick}>Click me</button>; 
    } 
} 

に反応:あなたが最初に表示された場合

it('should do something', async() => { 
    const promise = Promise.resolve(); 
    sinon.stub(server, 'sendResultToServer',() => promise); 
    const wrapper = shallow(<Button />); 
    wrapper.find(<button />).simulate('click'); 
    // this await will be resolved FIRST. Only then 
    // await server.sendResultToServer(result); in my code will be resolved 
    await promise; 
    expect(localStorage.getItem('sent')).to.equal('true'); 
}) 

をこのコードでは、すべてが大丈夫だと思うべきです。しかし、残念ながらそうではありません。私のテストでは、私が期待しているの後に約束await promise;を待っています。しかし、実装コードも約束を待っています。したがって、約束がで実現する場合、の所在地は、の前に実行され、の前には、実装のコードが実行されます。言い換えると、私のテストはテストするコードの前で実行されます(私のマシンでMocha/Chai/Enzymeを使ってテスト済み)。私が必要とするのは逆順です。

これを解決する方法を知っている人はいますか?

+0

あなたは、あなたのテスト –

+0

にクリックハンドラを呼び出すことはありませんそして、どのようにあなたが(関数handleClickをテストしますか)?私の例では、反応成分の内部にあります。しかし、私はそれをReactコンポーネントの上に書いて、それをエクスポートすることはできませんでした。したがって、この関数にアクセスできるのはクリックハンドラだけです。 – LongFlick

答えて

0

あなたはハンドラをクリックトリガする必要があります。

it('should do something', async() => { 
    const promise = Promise.resolve(); 
    sinon.stub(server, 'sendResultToServer',() => promise); 
    const wrapper = shallow(<Select />); 
    wrapper.simulate('click') 
    await promise; 
    expect(localStorage.getItem('sent')).to.equal('true'); 
}) 
+0

ああ、申し訳ありませんが、私の悪い。コピーと貼り付けをするとそれが起こります。私はすでにそれをして、それはまさに私の問題です:*イベント後*約束の順序は保証されていません。テストの約束は私のコードの約束より早く解決します。私は私の質問を更新/修正します。 – LongFlick

+0

「canDoSomething」はどこから来ていますか?これは歓迎される必要があるようです –

+0

これは良い質問です。この時点で私のコードには「終了」はありません。それで、私はこの時点で新しいルートにリダイレクトすると想像してください。それとも私はここで何もしません。私はエラーが発生した場合にのみそれを表示します。エラーが発生しなかった場合(sent = true)、何もしません。 多分私はそれについてもっと考えると、ここにいくつかの建築上の問題があります。 – LongFlick

関連する問題