浅渲染笑话快照
Shallow Rendering Jest Snapshots
我刚开始进行 Jest 和快照测试,我想知道为什么所有示例都使用 "deep rendering" React 组件来创建快照。
示例
const A = () => {
return <div><B /><B /></div>
}
const B = () => {
return <div>This is B</div>
}
// TEST
describe('Test', () => {
it('renders correctly', () => {
const tree = ReactTestRenderer.create(
<A />
).toJSON();
expect(tree).toMatchSnapshot();
});
});
快照:
exports[`Summary DOM rendering renders correctly 1`] = `
<div>
<div>
This is B
</div>
<div>
This is B
</div>
</div>
`;
虽然这有时很有用,但我认为将 A 和 B 分开 tests/snapshots 并进行浅层渲染更有意义,这样如果我更改 B,我的 A 快照就不需要更新。所以我希望我的快照看起来像这样:
exports[`Summary DOM rendering renders correctly 1`] = `
<div>
<B />
<B />
</div>
`;
有什么办法吗?这首先是个好主意吗?如果可能,为什么浅层渲染不是文档中的首选方式?
您可以使用 enzyme 来 shallow-render 您的组件。
我不能肯定地告诉你为什么它不是文档中的首选方法,但我的猜测是因为官方没有内置该功能react-test-renderer
。
更新(2018 年 1 月 3 日)
Shallowrender 已移至 react-test-renderer
import ShallowRenderer from 'react-test-renderer/shallow'
it('Matches snapshot', () => {
const renderer = new ShallowRenderer()
const result = renderer.render(<A />)
expect(result).toMatchSnapshot()
})
您也可以将 react-test-utils
Shallow Rendering 用于快照测试:
import ReactTestUtils from 'react-addons-test-utils';
describe('Test', () => {
it('renders correctly', () => {
const renderer = ReactTestUtils.createRenderer();
expect(renderer.render(<A />)).toMatchSnapshot();
});
});
有了它,您可以创建仅渲染 1 级深度的渲染器,即:它只会渲染组件的 render()
函数中的内容,而不渲染子组件。
react-test-renderer
是一个不同的渲染器,它将您的组件(和整个树)渲染到 JSON。目前它没有浅渲染的选项,它将像在浏览器中一样工作并渲染所有内容,但 JSON.
它们都适合测试,因为它们不需要 DOM 环境,而且它们具有不同的特性。您可以选择更适合您的用例的一种。
Shallow
渲染是单元测试的首选,单元测试只测试一个组件。在您的问题中,浅渲染 <A/>
组件是正确的方法。 it('renders correctly')
测试应该只检查 <A/>
以某种方式呈现。该测试不应取决于 <B/>
的呈现方式。
要测试涉及多个组件的更复杂的行为,可以使用 mount
or render
。这允许测试 <A/>
和 <B/>
.
的方面
(我使用enzyme
进行测试渲染。)
我刚开始进行 Jest 和快照测试,我想知道为什么所有示例都使用 "deep rendering" React 组件来创建快照。
示例
const A = () => {
return <div><B /><B /></div>
}
const B = () => {
return <div>This is B</div>
}
// TEST
describe('Test', () => {
it('renders correctly', () => {
const tree = ReactTestRenderer.create(
<A />
).toJSON();
expect(tree).toMatchSnapshot();
});
});
快照:
exports[`Summary DOM rendering renders correctly 1`] = `
<div>
<div>
This is B
</div>
<div>
This is B
</div>
</div>
`;
虽然这有时很有用,但我认为将 A 和 B 分开 tests/snapshots 并进行浅层渲染更有意义,这样如果我更改 B,我的 A 快照就不需要更新。所以我希望我的快照看起来像这样:
exports[`Summary DOM rendering renders correctly 1`] = `
<div>
<B />
<B />
</div>
`;
有什么办法吗?这首先是个好主意吗?如果可能,为什么浅层渲染不是文档中的首选方式?
您可以使用 enzyme 来 shallow-render 您的组件。
我不能肯定地告诉你为什么它不是文档中的首选方法,但我的猜测是因为官方没有内置该功能react-test-renderer
。
更新(2018 年 1 月 3 日)
Shallowrender 已移至 react-test-renderer
import ShallowRenderer from 'react-test-renderer/shallow'
it('Matches snapshot', () => {
const renderer = new ShallowRenderer()
const result = renderer.render(<A />)
expect(result).toMatchSnapshot()
})
您也可以将 react-test-utils
Shallow Rendering 用于快照测试:
import ReactTestUtils from 'react-addons-test-utils';
describe('Test', () => {
it('renders correctly', () => {
const renderer = ReactTestUtils.createRenderer();
expect(renderer.render(<A />)).toMatchSnapshot();
});
});
有了它,您可以创建仅渲染 1 级深度的渲染器,即:它只会渲染组件的 render()
函数中的内容,而不渲染子组件。
react-test-renderer
是一个不同的渲染器,它将您的组件(和整个树)渲染到 JSON。目前它没有浅渲染的选项,它将像在浏览器中一样工作并渲染所有内容,但 JSON.
它们都适合测试,因为它们不需要 DOM 环境,而且它们具有不同的特性。您可以选择更适合您的用例的一种。
Shallow
渲染是单元测试的首选,单元测试只测试一个组件。在您的问题中,浅渲染 <A/>
组件是正确的方法。 it('renders correctly')
测试应该只检查 <A/>
以某种方式呈现。该测试不应取决于 <B/>
的呈现方式。
要测试涉及多个组件的更复杂的行为,可以使用 mount
or render
。这允许测试 <A/>
和 <B/>
.
(我使用enzyme
进行测试渲染。)