如何在结束测试之前等待Redux Persist再水化

时间:2018-06-13 04:42:49

标签: reactjs react-native jestjs redux-persist

我有以下代码:

const App = () => {
    return (
        <Provider store={store}>
            <PersistGate persistor={persistor} loading={<Text>Loading!</Text>}>
                <ConnectedRootComponent />
            </PersistGate>
        </Provider>
    );
};

export default App;

使用redux-persist来补充状态,在此之前,它将显示加载属性中的内容。我有一个Jest测试(只是默认的一个带有反应原生的开箱即用):

it('renders without crashing', () => {
  const rendered = renderer.create(<App />).toJSON();
  console.log("Rendering: " + JSON.stringify(rendered));
  expect(rendered).toBeTruthy();
});

但是虽然测试通过,但我发现persist/PERSISTpersist/REHYDRATE仍在发生的操作,以及在测试中打印到控制台的值(渲染输出)是:

{
    "type": "Text",
    "props": {
        "accessible": true,
        "allowFontScaling": true,
        "ellipsizeMode": "tail"
    },
    "children": ["Loading!"]
}

我想要做的是等到redux-persist完成水合,然后检查渲染值。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

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存储重新补水后该回调将执行。

答案 1 :(得分:0)

您可以模拟PersistGate以始终返回props.children,然后您的测试可以检查呈现的值。

以下是创建模拟的方法:

jest.mock('redux-persist/integration/react', () => ({
  PersistGate: props => props.children,
}))

Credits

答案 2 :(得分:0)

您可以在测试时忽略持久化

jest.mock('redux-persist/integration/react', () => ({
  PersistGate: props => props.children,
}))
jest.mock('redux-persist', () => ({
  ...jest.requireActual('redux-persist'),
  persistReducer: jest.fn().mockImplementation((config, reducer) => reducer),
}));