2

我正在尝试使用以下内容测试具有 useEffect 挂钩的屏幕:

export const SomeScreen: React.FC<Props> = ({}) => {

  const [isSensorAvailable, setIsSensorAvailable] = useState(false);

  useEffect(() => {
    const isSensorAvailableCheck = async () => {
      try {
        await FingerprintScanner.isSensorAvailable();
        setIsSensorAvailable(true);
      } catch (error) {
        console.log(error);
      }
    };

    isSensorAvailableCheck();
  }, []);
  
  ...
   Here goes code that renders View if the sensor is available
  ...
}

我正在尝试以下测试:


import {default as FingerprintScannerMock} from 'react-native-fingerprint-scanner';

jest.mock('react-native-fingerprint-scanner');

(FingerprintScannerMock.isSensorAvailable as jest.Mock).mockResolvedValue(true);

const createTestProps = (props: Object) => ({
  navigation: {
    navigate: jest.fn(),
  },
  ...props,
});

describe('Testing some screen', () => {

   test('testing some functionalities', async () => {
     let props: any;
    props = createTestProps({});

    const component = render(
      <Provider store={store}>
        <RegisterPasswordScreen {...props} />
      </Provider>,
    );

    const {getByText, getByTestId, getAllByTestId} = component;

    const container = getByTestId('containerId');

    expect(container).toBeTruthy();
   });

});

但是这个容器永远找不到,因为setIsSensorIsAvailable永远不会将值设置为true,因为以下错误:

An update to SomeScreen inside a test was not wrapped in act(...).

我什至像这样尝试了一切:


  const component = await waitFor(() =>
       render(<Provider store={store}>
         <RegisterPasswordScreen {...props} />
        </Provider>,
       );
   ); 

但是当我运行这个测试时,它永远不会结束。也尝试将其包装起来,act(...)但这也不起作用,然后错误如下: Can't access .root on unmounted test renderer

任何帮助表示赞赏,谢谢!

4

2 回答 2

0

有类似的问题

使用act(https://reactjs.org/docs/testing-recipes.html#act)包装组件解决了我的问题

使用 create 包装您的组件以进行本机反应,而不是使用包装在 act 中的典型渲染方法

import { act, create } from 'react-test-renderer';


it('test', () => {
    await act(async () => {
        create(<ComponentWithAsyncUseEffect />);
    });
})
于 2022-01-27T13:35:49.947 回答
0

我最终使用findByTestId而不是getByTestId,现在它运行良好。

于 2021-03-11T13:45:09.733 回答