【问题标题】:Run useEffect hook before rendering jest snapshot in react-test-renderer test在 react-test-renderer 测试中渲染 jest 快照之前运行 useEffect 钩子
【发布时间】:2022-01-31 20:46:47
【问题描述】:

假设我有以下称为Basic.js 的基本组件:

import React, { useState, useEffect } from 'react';

export default () => {
  const [items, setItems] = useState([{ name: 'original' }]);

  useEffect(() => {
    setItems([{ name: 'new1' }, { name: 'new2' }]);
  }, []);

  return (
    <div>{items && items.map((item, i) => <div key={i}>{item.name}</div>)}</div>
  );
};

使用react-test-renderer,我可以编写如下测试:

import React from 'react';
import TestRenderer from 'react-test-renderer';
import Basic from './Basic';

describe('Basic', () => {
  test('renders', async done => {
    let component = TestRenderer.create(<Basic />);
    setImmediate(() => {
      expect(component.toJSON()).toMatchSnapshot();
      done();
    });
  });
});

当我运行npm test 时会生成以下笑话快照:

exports[`Basic renders 1`] = `
<div>
  <div>
    original
  </div>
</div>
`;

如何编写测试以运行useEffect 挂钩并反映在快照中?所以生成的快照是这样的:

exports[`BasicClass renders 1`] = `
<div>
  <div>
    new1
  </div>
  <div>
    new2
  </div>
</div>
`;

这是不可能的吗,有没有我可以用来运行这个钩子的测试库?

【问题讨论】:

  • 试试act()
  • 你找到答案了吗?

标签: reactjs jestjs react-test-renderer


【解决方案1】:

使用行为

import React from 'react';
import TestRenderer from 'react-test-renderer';
import Basic from './Basic';

describe('Basic', () => {
  test('renders', async () => {
    let component;
    await act(async () => {
      component = TestRenderer.create(<Basic />);
    });
    expect(component.toJSON()).toMatchSnapshot();
  });
});

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 2021-05-27
    • 2021-05-18
    • 2021-04-17
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多