Я не могу справиться с тестированием onChange, также имел дело с проблемами с onClick, но каким-то образом мне это удалось.
Я следовал документам Enzyme и Jest, и это не сработало, прошел 2 курса по Pluralsight и но результат был тот же, читал много статей и решений здесь, но все равно это не пройдет. Я узнал об устаревании .simulate() и попробовал props.onChange.
Буду рад любой помощи.
Это компонент, который я хотел бы протестировать:
const [details, setdetails] = useState(
{
fullName: '',
email: '',
phone: ''
}
)
const [errors, setErrors] = useState({});
const [isValid, setValid] = useState(false);
const handleChange = event => {
let { name, value } = event.target;
console.log(value, name, event.target);
event.preventDefault();
setdetails(prevDetails => ({
...prevDetails,
[name]: value
}));
}
return (
<div className="contact" id="contact">
<div className="logo"></div>
<div className="contact-title">
<h6>PLEASE LEAVE YOUR DETAILS BELOW AND WE’LL CONTACT YOU</h6>
</div>
<div className="fields">
<form>
<div className="input-field">
<label>Full Name:</label>
<input name="fullName" placeholder="Full Name" onChange={handleChange}
/>
<div className="text-danger">{errors.fullName}</div>
</div>
<div className="input-field">
<label>Email:</label>
<input name="email" placeholder="Email" onChange={handleChange}
/>
<div className="text-danger">{errors.email}</div></div>
<div className="input-field">
<label>Phone:</label>
<input name="phone" placeholder="Phone Number" onChange={handleChange}
/>
<div className="text-danger">{errors.phone}</div>
</div>
<div>
<button type="submmit"
className="btn-dark button"
onClick={handleClick}
>Submit</button>
</div>
</form>
</div>
</div>
)
Попытки тестирования:
describe('', () => {
it('', () => {
let mockOnChange = jest.fn();
const props = {
mockOnChange: mockOnChange
}
let wrapper = shallow(<Contact {...props} />)
console.log(wrapper.debug());
let event = {
preventDefault: () => { },
name: 'fullName',
target: {
value: 'test'
}
}
wrapper.find('input').at(0).props().onChange({ event })
expect(mockOnChange).toHaveBeenCalledWith('test');
})
it('second assertion', () => {
let mockOnChange = jest.fn();
let name = 'fullName';
let value = 'test';
let wrapper = shallow(<Contact onChange={mockOnChange} />)
console.warn(mockOnChange);
wrapper.instance().onChange({ target: { name, value } });
expect(mockOnChange).toHaveBeenCalled('test');
})
it('', () => {
let handleChange = jest.fn();
let mockName = 'fullName';
let mockValue = 'test';
let wrapper;
wrapper = shallow(<Contact onChange={handleChange} />);
wrapper.find('input').at(0).simulate('change', {
preventDefault: () => { },
target: {
name: mockName,
value: mockValue
}
})
expect(handleChange).toHaveBeenCalledWith("test");
})
})
describe("simulate onchange input fileds", () => {
let wrapper;
let mockOnChange;
beforeEach(() => {
mockOnChange = jest.fn();
const props = {
mockOnChange: mockOnChange
}
wrapper = shallow(<Contact {...props} />);
});
it('first assertion', () => {
wrapper.find('input').at(0).simulate('change', {
preventDefault: () => { },
target: { value: 'test' }
})
expect(mockOnChange).toBeCalledWith("test");
})
it('should call onChange prop', () => {
const event = {
preventDefault: () => { },
target: {
name: 'fullName',
value: 'test'
}
};
const component = shallow(<Contact onChange={mockOnChange} />);
component.find('input').at(0).props().onChange('change', event);
expect(mockOnChange).toBeCalledWith('test');
});
})
input[name="fullName"]. или вы можете попробовать.find("input").filter({name: "fullName"})13.01.2020re answering so fast. I have tried both but, itвсе еще подали заявку, утверждая, что значение не определено. есть идеи, почему? может я что-то не так декларирую? 13.01.2020prop('value')undefined? или.find()возвращаетundefined? 13.01.2020details.fullNameв атрибутvalue. Вот почему он не работал в тесте. Кроме того, поначалу это может работать для вас, текущая версия никогда не позволит вам устанавливать значение программно без изменения кода. Так что лучше сделайте это прямо сейчас. 13.01.2020nameв неправильное место внутриevent(не вtarget, а как опору 1-го уровня). Обновленный ответ, проверьте его. Испытание прошло для меня. 14.01.2020