reactjs - 在 react-test-renderer 测试中渲染 jest 快照之前运行 useEffect 钩子
问题描述
假设我有以下基本组件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>
`;
这是不可能的吗,有没有我可以用来运行这个钩子的测试库?
解决方案
使用行为
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();
});
});
推荐阅读
- php - 如何使推送通知将用户发送到应用程序中的特定页面?
- android - Android Kotlin - 移除/重置 RecyclerView OnScrollListener
- python - 如何使用一系列 2D 图像创建 3D 图像
- assembly - 如果 AL 包含 I 或 3,则显示“o”;如果 AL 包含 2 或 4,则在汇编代码中显示“e”
- swift - AWSAppSync 快速,不获取 DynamoDB 中的所有记录
- c# - 为什么我没有“访问控制允许来源”?
- swagger-ui - 如何在 swagger php 中添加信息部分
- vue.js - 如何使用fabricjs更改vue中的图像
- javascript - JavaScript计算的日期在周末登陆,如何更改为下周一
- angular - 如何从数据库列中读取文件路径并使用角度显示内容