ScrollContainerと呼ばれるReactコンポーネントがあり、コンテンツが一番下にスクロールされたときにprop関数を呼び出します。
基本的に:
_componentDidMount() {
const needsToScroll = this.container.clientHeight != this.container.scrollHeight
const { handleUserDidScroll } = this.props
if (needsToScroll) {
this.container.addEventListener('scroll', this.handleScroll)
} else {
handleUserDidScroll()
}
}
componentWillUnmount() {
this.container.removeEventListener('scroll', this.handleScroll)
}
handleScroll() {
const { handleUserDidScroll } = this.props
const node = this.container
if (node.scrollHeight == node.clientHeight + node.scrollTop) {
handleUserDidScroll()
}
}
_
_this.container
_は、renderメソッドで次のように設定されます。
_<div ref={ container => this.container = container }>
...
</div>
_
Jest + Enzymeを使用してこのロジックをテストしたいと思います。
ClientHeight、scrollHeight、scrollTopの各プロパティを、テストシナリオで選択した値にする方法が必要です。
浅い代わりにマウントを使用すると、これらの値を取得できますが、常に0です。ゼロ以外の値に設定する方法はまだ見つかりません。コンテナをwrapper.instance().container = { scrollHeight: 0 }
などに設定できますが、これはテストコンテキストのみを変更し、実際のコンポーネントは変更しません。
任意の提案をいただければ幸いです!
Jest spyOnは、バージョン22.1.0以降のゲッターとセッターをモックするために使用できます。 jest docs を参照してください
以下のコードを使用して、document.documentElement.scrollHeightの実装をモックしました
const scrollHeightSpy = jest
.spyOn(document.documentElement, 'scrollHeight', 'get')
.mockImplementation(() => 100);
ScrollHeight値として100を返します。
JSDOMは実際のレンダリングを行わず(DOM構造をシミュレートするだけです)、要素の寸法などは期待どおりに計算されません。メソッド呼び出しを介してディメンションを取得する場合、テスト内でこれらをモックする方法があります。例えば:
beforeEach(() => {
Element.prototype.getBoundingClientRect = jest.fn(() => {
return { width: 100, height: 10, top: 0, left: 0, bottom: 0, right: 0 };
});
});
これは明らかにあなたの例では機能しません。要素のこれらのプロパティをオーバーライドして、変更をモックすることができる場合があります。しかし、それが特に意味のある/有用なテストにつながることはないと思います。
参照 このスレッド