Да кажем, че имам 2 компонента. Родител, който съдържа дете.
Дъщерният компонент е такъв бутон:
var React = require('react');
var ChildButton = React.createClass({
onSubmitAnswer: function(e) {
this.props.onClick(this);
},
render: function() {
return (
<div className={this.props.visibility}>
<button onClick={this.onSubmitAnswer}>Click Me</button>
</div>
)
}
});
module.exports = ChildButton;
Той живее в своя родител, който изглежда така:
var React = require('react'),
ChildButton = require('./face-submit-button');
var ParentComponent = React.createClass({
onButtonSubmit: function() {
//Something happens here
},
render: function() {
return (
<div>
//Some more components
<ChildButton text="Submit" onClick={this.onButtonSubmit} />
</div>
)
}
});
module.exports = ParentComponent;
Дотук добре. Всичко работи според очакванията в потребителския интерфейс. Но срещнах някои проблеми в тестовете на Jest, използвайки TestUtils.Simulate.click().
Моят тест за компонента ChildButton е ясен и се държи, както бих очаквал.
jest.dontMock('./child-button');
describe('ChildButton', function() {
var React = require('react/addons'),
ChildButton = require('./child-button'),
TestUtils = React.addons.TestUtils;
describe('events', function() {
var button,
onClickStub;
beforeEach(function() {
onClickStub = jest.genMockFn();
button = TestUtils.renderIntoDocument(
<ChildButton onClick={onClickStub} />
);
});
it('should call onSubmitAnswer when the button is clicked', function() {
var buttonTag = TestUtils.findRenderedDOMComponentWithTag(button, 'button');
TestUtils.Simulate.click(buttonTag);
expect(onClickStub).toBeCalled();
});
});
});
Моят тест за родителския компонент започна да изглежда по същия начин:
jest.dontMock('./parent-component');
describe('ParentComponent', function() {
var React = require('react/addons'),
ParentComponent = require('./parent-component'),
ChildButton = require('./child-button'),
TestUtils = React.addons.TestUtils;
describe('events', function() {
var parent,
onClickStub;
beforeEach(function() {
onClickStub = jest.genMockFn();
parent = TestUtils.renderIntoDocument(
<ParentComponent onClick={onClickStub} />
);
});
it('should call onButtonSubmit when a click is triggered', function() {
var childButton = TestUtils.findRenderedComponentWithType(parent, ChildButton);
TestUtils.Simulate.click(childButton);
expect(onClickStub).toBeCalled();
});
});
});
Но този тест се проваля. Единствената разлика, която виждам между тези два теста е, че единият използва директно HTML таг и щраква върху него, докато другият задейства щракване върху React компонент. Мога ли да не използвам събитието за щракване върху компонентите на React директно? Правилно ли е предположението ми?
И ако е така, има ли начин да се задейства щракване върху компонентите на React по различен начин в тестовете? Опитах да използвам SimulateNative, но това имаше същия ефект, onClickStub не се извиква при щракване.