这是我碰到的,而试图通过Airbnb的阵营测试库,Enzyme重构我的一些反应的组分的一个有趣的问题情境。阵营单元测试与酶不重新绑定的辅助功能
我想解释我的问题的最好办法是通过一个例子。
这里是一个小阵营组件将根据它从它的父组件接收道具显示一条消息:
test.js:
import React from 'react';
function renderInnerSpan() {
const {foo} = this.props;
if (foo) {
return <span>Foo is truthy!</span>;
}
return <span>Foo is falsy!</span>;
}
export default class extends React.Component {
render() {
return (
<div>
{renderInnerSpan.call(this)}
</div>
);
}
}
,这里是一个测试套件此组件与两个通过测试:
test.spec.js:
import Test from '../../src/test';
import React from 'react';
import {shallow} from 'enzyme';
import {expect} from 'chai';
describe('Test Suite',() => {
let renderedElement,
expectedProps;
function renderComponent() {
const componentElement = React.createElement(Test, expectedProps);
renderedElement = shallow(componentElement);
}
beforeEach(() => {
expectedProps = {
foo: true
};
renderComponent();
});
it('should display the correct message for truthy values',() => {
const span = renderedElement.props().children;
expect(span.props.children).to.equal('Foo is truthy!');
});
it('should display the correct message for falsy values',() => {
expectedProps.foo = false;
renderComponent();
const span = renderedElement.props().children;
expect(span.props.children).to.equal('Foo is falsy!');
});
});
这工作得很好,但测试组件当前执行效率不高,因为它可以。通过使用.call(this)
,它每次调用render()
函数时都会创建一个新函数。我可以在组件的构造结合的this
正确的上下文避免这种情况,像这样:
export default class extends React.Component {
constructor(props) {
super(props);
renderInnerSpan = renderInnerSpan.bind(this);
}
render() {
return (
<div>
{renderInnerSpan()}
</div>
);
}
}
此更改后,该组件仍然按预期工作,但测试启动失败:
AssertionError: expected 'Foo is truthy!' to equal 'Foo is falsy!'
Expected :Foo is falsy!
Actual :Foo is truthy!
我加在构造函数中,其证实,当我预计它的构造仍被称为console.log(props.foo)
,它的接收道具是正确的。不过,我添加了一个console.log(foo)
的renderInnerSpan
里面,它看起来像值为true,则所有的时间,即使经过重新呈现组件,其foo
道具明确设置为false
。
它看起来像renderInnerSpan
是只能绑定一次,酶重新使用这种为每一个测试。那么,是什么给了?我正在测试中重新创建我的组件,它使用我期望的值调用它的构造函数 - 为什么我的约束函数renderInnerSpan
继续使用旧值?
在此先感谢您的帮助。
无状态功能组件看起来像是要走到这里的路。我最终采取了一种稍微不同的方法,并将我的'renderInnerSpan'变成了SFC。感谢您的解释,现在这变得更有意义。 –