4

我们正在讨论 Enzyme浅层渲染和每次测试在每次测试中重新运行浅层的时间。无论是方法、点击次数、选择器长度等,我建议如果我们在测试运行之前对组件进行一次浅层渲染,而不是每次都进行一次浅渲染,我们的测试可能会运行得更快。

是否有任何专家可以指出哪种方式更快,以及任何一种方式是否存在任何陷阱?这些示例使用的是AVA运行器(为了讨论而略微做作)。

例如,这是一种方式(A)...

import TagBox from '../TagBox';
const props = { toggleValue: sinon.spy() };
let wrapper = {};

test.before(t => {
    wrapper = shallow(<TagBox />);
});

test('it should have two children', t => {
    t.is(wrapper.children().length, 2);
});

test('it should safely set props', t => {
    wrapper.setProps({...props});
    t.is(wrapper.children().length, 2);
});

test('it should call when clicked', t => {
    wrapper.setProps({...props});
    wrapper.find({tagX : true}).last().simulate('click');
    t.true(props.toggleValue.calledOnce);
});

这是另一个(B)...

import TagBox from '../TagBox';

test('it sets value to null ...', t => {
    const props = {multiple: false};
    const wrapper = shallow(<TagBox {...props} />);
    t.is(wrapper.state('currentValue'), null);
});

test('it sets value to [] if multiple', t => {
    const props = {multiple: true};
    const wrapper = shallow(<TagBox {...props} />);
    t.deepEqual(wrapper.state('currentValue'), []);
});

test('it does not use value if ...', t => {
    const props = = {value: 3};
    const wrapper = shallow(<TagBox {...props} />);
    t.is(wrapper.state('currentValue'), null);
});

// etc. etc.

请注意,在测试 B 中,每个测试都有一个新的浅层包装器,而实际上除了 props 没有任何变化。

在 100 次测试过程中,您预计完成时间的差异是多少?

是否有机会在较高范围内进行一次浅渲染(测试 A)会污染测试状态?

4

2 回答 2

3

浅渲染器旨在快速,因为它只渲染单个组件。因此,当您为每个测试创建新组件时,通常不会遇到任何性能问题。

TagBox此外,如果组件具有内部状态,您的示例 A 可能无法正常工作。这就是为什么示例 B 是编写测试的更可取的方式。

于 2016-08-22T10:05:43.077 回答
1

shallow可能不是您的问题,因为它被设计为渲染组件的最快方式,而无需级联所有子渲染。

然后您可以考虑更改您的测试运行引擎,例如,与 Jest 相比,AVA 有点慢。一年前我做了这个改变,它快了很多。Jest 还在它的基本工具包中提供了更多有用的东西,例如模拟函数。

更多信息:https ://facebook.github.io/jest/

于 2017-08-09T21:11:21.493 回答