基本的に、コンポーネントがマウントされると、イベントリスナがサイズ変更イベントをリッスンします。 isMobileView状態を切り替えてから、小道具として子に渡します。したがって、これが機能し、テストされることが不可欠です。私はテストにかなり慣れていないので、ウィンドウのサイズを変更し、すべてのロジックを実行し、それがどのように実行されるかをテストするテストを作成する方法を見つけようとしています。
コードは次のとおりです-
componentDidMount() {
this.setMobileViewState()
window.addEventListener('resize', this.setMobileViewState.bind(this));
}
setMobileViewState() {
if(document.documentElement.clientWidth <= this.props.mobileMenuShowWidth) {
this.setState({ isMobileView: true })
} else {
this.setState({ isMobileView: false })
}
}
コードが機能することは知っていますが、テストを書きたいと思います。基本的には、状態が正しく変更されることを確認するものです。
JestとEnzymeを使用すると、次のことができます。 JestにはJSDOMが組み込まれています。テストでは、Jestはwindow
オブジェクトを提供し、global
で表されます(デフォルトのwindow.innerWidth
Jestによって設定された1024px):
test('Test something when the viewport changes.', () => {
// Mount the component to test.
const component = mount(<ComponentToTest/>);
...
// Change the viewport to 500px.
global.innerWidth = 500;
// Trigger the window resize event.
global.dispatchEvent(new Event('resize'));
...
// Run your assertion.
});
TypeScriptエラーメッセージが表示される場合
読み取り専用プロパティであるため、「innerWidth」に割り当てることができません。
試してください:
Object.defineProperty(window, 'innerWidth', {writable: true, configurable: true, value: 200})
この行は私にとって最も効果的でした。
window = Object.assign(window, { innerWidth: 500 });