15

我有以下代码:

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

export default App;

它使用 redux-persist 来重新水化状态,在完成之前,它将显示加载属性中的内容。我有一个 Jest 测试(只是开箱即用的 react native 附带的默认测试):

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 完成水合,然后检查渲染值。我怎样才能做到这一点?

4

3 回答 3

3
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();
  });
});

你只需要从 App 文件exportpersistor,然后使用上面的代码进行测试。它工作得很好,我已经测试过了。

你可以注意到persistor对象可以订阅一个回调,当 redux 存储重新水化时,该回调会被执行。

于 2018-06-22T16:14:34.857 回答
2

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

以下是创建模拟的方法:

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

学分

于 2018-06-22T13:16:07.947 回答
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),
}));
于 2021-01-25T13:29:09.427 回答