いくつかの非同期コードを実行し、componentDidMountでsetStateを呼び出すReactコンポーネントをテストしようとしています。ここで酵素でテストするときに解決するcomponentDidMountのsetStateを待つ方法は?
は、私は私がテストしたいコンポーネントの反応である:ここでは
/**
*
* AsyncComponent
*
*/
import React from 'react';
class AsyncComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
loaded: false,
component: null,
};
}
componentDidMount() {
this.props.component.then(component => {
this.setState({
loaded: true,
component: component.default ? component.default : component,
});
});
}
render() {
if (!this.state.loaded) {
return null;
}
const Component = this.state.component;
const { component, ...rest } = this.props;
return <Component {...rest} />;
}
}
export default AsyncComponent;
をテストケースです。私は冗談と酵素を使用しています。
import React from 'react';
import { mount } from 'enzyme';
import AsyncComponent from '../index';
const TestComponent =() => <div>Hello</div>;
describe('<AsyncComponent />',() => {
it('Should render loaded component.',() => {
const promise = Promise.resolve(TestComponent);
const rendered = mount(<AsyncComponent component={promise} />);
expect(rendered.state().loaded).toBe(true);
});
});
state.loadedがfalseに設定されているため、テストは失敗します。期待通りに呼び出す前にAsyncComponentが完全にロードされていることを確認する方法はありますか?
私は期待値アサーションをsetTimeoutにラップするとうまくいくが、それはむしろやっかいなようだ。これを行うにはどうしたらいいですか?
そのコードが私のために働いたが、テストはrendered.state」で失敗します.loaded "は依然としてfalseと等しい。 –
約束の中のコールバックが呼ばれていることを確認できますか? –
'Promise.resolve(TestComponent)'はコンポーネントで即座に解決されます。これは、 'setState'とコンポーネントがテストの準備ができていることとは何の関係もありません。このコードは意味をなさないものであり、記述された問題を解決するものではありません。 –