2017-10-03 18 views
0

で呼び出されていない私は、ログインコンポーネントを反応させ、テストしたいのですが、モック関数が呼び出されていない:冗談:モック機能モック約束機能

ログイン:私はjestを使用

export default class LoginPage extends PureComponent { 
    static propTypes = { 

     login: PropTypes.func.isRequired, 
     history: PropTypes.shape({ 
      replace: PropTypes.func.isRequired, 
     }).isRequired, 
    }; 

    onSubmit = (e) => { 
     this.props.login(this.state.username, this.state.password) 
      .then(() => { 

       this.props.history.replace('/'); 
      }); 
    }; 

    render() { 
     return (
      <form onSubmit={this.onSubmit}> 
       ... 
      </form> 
     ); 
    } 
} 

const props = { 
    login: jest.fn(() => Promise.resolve('success')), 
    history: { 
     replace: jest.fn() 
    }, 
}; 

const wrapper = mount(<LoginPage {...props}/>); 

const form = wrapper.find(Form); 
const inputs = form.find('input'); 
const username = inputs.at(0); 
const password = inputs.at(1); 
username.simulate('change', {target: {value: 'Changed'}}); 
password.simulate('change', {target: {value: 'Changed'}}); 

form.simulate('submit'); 

expect(props.login).toBeDefined(); 
expect(props.history.replace).toBeDefined(); 

// this is success 
expect(props.login).toBeCalled(); 

// this is failure 
expect(props.history.replace).toBeCalled(); 

私は2つの機能を模擬し、history.replaceはによって呼び出される必要があります。これをテストする+ enzyme 10、loginはPromise関数として嘲笑されます。

expect(props.login).toBeCalled()テストが成功しました。

しかし、expect(props.history.replace).toBeCalled()テストに失敗しました。

Ilog props.history.replace.mockとなると、{ calls: [], instances: [] }が出力されます。

答えて

1

あなたが使用している約束についてJestに知らせる必要があります。そうしないと、約束が解決される前にテストが終了するまで待機しません。 Hereは、非同期のものをテストするためのドキュメントです。 テストがasync機能になる必要があります。

それ(、非同期()=> { のconst P = Promise.resolve(「成功」「何かを」:約束はフォーム送信後に解雇されたawaitで使用できる変数に格納する必要があります)

const props = { 
    login: jest.fn(() => p), 
    history: { 
     replace: jest.fn() 
    }, 
}; 

const wrapper = mount(<LoginPage {...props}/>); 

const form = wrapper.find(Form); 
const inputs = form.find('input'); 
const username = inputs.at(0); 
const password = inputs.at(1); 
username.simulate('change', {target: {value: 'Changed'}}); 
password.simulate('change', {target: {value: 'Changed'}}); 

form.simulate('submit'); 
await p 
expect(props.login).toBeDefined(); 
expect(props.history.replace).toBeDefined(); 

// this is success 
expect(props.login).toBeCalled(); 

// this is failure 
expect(props.history.replace).toBeCalled(); 

})

+0

THK、それは完璧な仕事! – someok

関連する問題