react-router-dom
テストケースの 1 つでモックを作成し、useHistory
フックがテストで機能するようにしようとしています。jest.mock
モジュール全体をモックし、jest.requireActual
モックしたくないその他のプロパティは保持するために、 を使用することにしました。
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useHistory: () => ({
location: {
pathname: '/list',
},
}),
}));
これは実際には、次の質問に対する評価の高い解決策の 1 つから派生したものです。jest で useHistory フックをモックするにはどうすればいいですか?
しかし、TypeScriptコンパイラは次の行で次のエラーをフラグ付けしています。...jest.requireActual('react-router-dom'),
TS2698: スプレッド タイプはオブジェクト タイプからのみ作成できます。
興味深いことに、この問題はjestとts-jestを最新バージョン(jest v26)にアップデートした後にのみ発生しました。jest 24.xxを使用していたときには、これらの問題は発生しませんでした。
"@types/jest": "^26.0.4",
"jest": "^26.1.0",
"ts-jest": "^26.1.1",
最新の jest バージョンでこの問題を解決する方法を知っている人はいますか?
ベストアンサー1
jest.requireActual
unknown
スプレッドできないタイプを返します。
正しいタイプは次のとおりです。
import * as ReactRouterDom from 'react-router-dom';
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom') as typeof ReactRouterDom,
useHistory: ...,
}));
簡単な修正方法は次のとおりですany
。
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom') as any,
useHistory: ...,
}));
この場合は型の安全性が損なわれないため、許容されます。
ES モジュールなのでreact-router-dom
、これをモックするより正しい方法は次のとおりです。
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom') as any,
__esModule: true,
useHistory: ...,
}));