私は次のコードを持っています:
const App = () => {
return (
<Provider store={store}>
<PersistGate persistor={persistor} loading={<Text>Loading!</Text>}>
<ConnectedRootComponent />
</PersistGate>
</Provider>
);
};
export default App;
これは状態を再水和するためにredux-persistを使用し、これが完了する前に、loadingプロパティに何が置かれているかを示します。私はJestテストを持っています(そのままの状態でreactネイティブに付属するデフォルトのテストのみ):
it('renders without crashing', () => {
const rendered = renderer.create(<App />).toJSON();
console.log("Rendering: " + JSON.stringify(rendered));
expect(rendered).toBeTruthy();
});
テストはパスしましたが、アクションがpersist/PERSIST
およびpersist/REHYDRATE
はまだ発生しており、テストでコンソールに出力される値(レンダリングされた出力)は次のとおりです。
{
"type": "Text",
"props": {
"accessible": true,
"allowFontScaling": true,
"ellipsizeMode": "tail"
},
"children": ["Loading!"]
}
Redux-persistがハイドレーションを完了するまで待ってから、レンダリングされた値を確認します。これどうやってするの?
import React from 'react';
import App, {persistor} from '../App';
import renderer from 'react-test-renderer';
it('renders without crashing', (done) => {
const appRendered = renderer.create(<App />);
persistor.subscribe(function(){
const rendered = appRendered.toJSON();
console.log("Rendering: " + JSON.stringify(rendered));
expect(rendered).toBeTruthy();
done();
});
});
アプリファイルからexport
persistor
を作成し、上記のコードを使用してテストするだけです。それは完全に動作し、私はテストしました。
persistor
オブジェクトはコールバックでサブスクライブでき、これはreduxストアが再水和したときに実行されます。
PersistGate
をモックして常にprops.children
を返すようにすると、テストでレンダリングされた値を確認できます。
モックを作成する方法は次のとおりです。
jest.mock('redux-persist/integration/react', () => ({
PersistGate: props => props.children,
}))
クレジット 。