2017-04-18 8 views
1

JestとEnzymeでReactコンポーネントをテストしたい。このコンポーネントはログインフォームです。ユーザーがログインボタンをクリックすると、結果に応じてオブジェクトモデルが適切に更新されているかどうかを確認したいと思います。Jest Reactテストで約束を待つ方法は?

ユーザーが送信ボタンをクリックしたときに呼び出されるコードの部分です。

// Login.jsx 
handleSubmit(e) { 

    var that = this; 

    this.setState({stateResult: "", errorLabel: ""}); 

    if(e) { 
    e.preventDefault(); 
    e.stopPropagation(); 
    } 

    MyService.login(this.state.email, this.state.password).then(function(account) { 
    that.setState({stateResult: "login-ok", errorLabel: ""}); 
    }).catch(function(err) { 
    that.setState({stateResult: "login-error", errorLabel: err.data.message}); 
    }); 
}; 

私はJestテストを書いた。ここでは、コードは次のとおりです。

// Login-test.js 
test('that when the signin fails, the stateResult model is updated with login-error',() => { 

    const wrapper = shallow(<Landing />); 
    wrapper.find('a#landingjsx-signin').simulate('click'); 

    wrapper.update(); 
    setTimeout(function() { 
     expect(wrapper.state().stateResult).toEqual("login-error"); 
    }, 100); 
}); 

それをテストするために、私はここでMyServiceで

jest.mock('../../../modules/MyService.js'); 

のモックを使う私のモックのコードは次のとおりです。

//MyService.js 
class MyService { 

    constructor() { 

    } 

    login(user, password) { 

    return new Promise((resolve, reject) => { 

     process.nextTick(() => { 
      if(user === "aaa") { 
       resolve({}); 
      } 
      else { 
       reject({ 
        data: { 
         message: "bad-password" 
        } 
       }); 
      } 
     }); 
    }); 
    } 
} 

export default new MyService(); 

テストが右の失敗します: - )

私の質問は:どのように私のテストからsetTimeout()呼び出しを削除するには?この約束に基づく機能をテストするには、より良い方法がありますか?

私の問題は、結果を期待する前に約束機能が失敗するのを待つ方法です。事前

答えて

2

だけ勘で

ありがとう:doneコールバックを追加してみてください。

// Login-test.js 
test('that when the signin fails, the stateResult model is updated with login-error', (done) => { 

    const wrapper = shallow(<Landing />); 
    wrapper.find('a#landingjsx-signin').simulate('click'); 

    wrapper.update(); 
    setTimeout(function() { 
     try { 
      expect(wrapper.state().stateResult).toEqual("login-error"); 
      done() 
     } catch (e) { 
      done.fail(e) 
     } 
    }, 100); 
}); 

期待してもエラーにスローとテストの失敗が呼ばれるようにdoneない原因となりますので、あなたは、のtry-catchで期待をラップする必要があります。

more extended examplesのjestドキュメントを参照してください。

関連する問題