反应快照测试
来自菜鸟教程
快照测试 在测试 React 组件时特别有用。 让我们看看它是如何完成的。
反应测试渲染器
你需要在序列化它们之前渲染你的 React 组件。 请务必安装 react-test-renderer 以便您可以安装。
yarn add --dev react-test-renderer
为组件创建快照
假设您有一个组件,当您单击按钮时会分页某人
// Pager.js
import React from 'react';
export default function Pager({ name }) {
const onClickCallback = () => alert(`Paging ${name}!`);
return (
<div>
<h1>{name}</h1>
<button onClick={onClickCallback}>Page</button>
</div>
);
}
你的测试应该看起来像
// Pager.test.js
import React from 'react';
import renderer from 'react-test-renderer';
import Pager from './Pager';
it('looks okay.', () => {
const name = 'John';
// Render the component with the props.
const tree = renderer.create(<Pager name={name}/>)
// Convert it to JSON.
.toJSON();
// And compare it to the snapshot.
expect(tree).toMatchSnapshot();
});
快照转到 __snapshots__ 文件夹,所有后续测试运行都将与之进行比较。 从那里您可以随意编辑 Pager; 只要相同的道具给出相同的结果,快照就会匹配。 但这也是一个问题。
快照不是灵丹妙药
重要的是要注意,虽然对象是可序列化的,但函数(因此回调)不是。 如果你打开 Pager.test.js.snap,你会看到 onClickCallback 被表示为 [Function]。
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`properly writes name. 1`] = `
<div>
<h1>
John
</h1>
<button
onClick={[Function]}
>
Page
</button>
</div>
`;
如果 Pager 被重写以便 onClickCallback 执行其他操作,快照仍然会通过。
export default function Pager({ name }) {
// Not what you want it to do, but it will still pass.
const onClickCallback = () => alert(`Paging {name}!`);
return (
<div>
<h1>{name}</h1>
<button onClick={onClickCallback}>Page</button>
</div>
);
}