這是我碰到的,而試圖通過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。感謝您的解釋,現在這變得更有意義。 –