- Mastering React Test:Driven Development
- Daniel Irvine
- 259字
- 2021-06-24 14:45:10
Modifying handleChange to work with multiple fields
The Git tag for this section is handle-change.
After adding all three fields, you will have ended up with three very similar onChange event handlers:
const handleChangeFirstName = ({ target }) =>
setCustomer(customer => ({
...customer,
firstName: target.value
}));
const handleChangeLastName = ({ target }) =>
setCustomer(customer => ({
...customer,
lastName: target.value
}));
const handleChangePhoneNumber = ({ target }) =>
setCustomer(customer => ({
...customer,
phoneNumber: target.value
}));
You can simplify these down into one function, but you'll need to modify your tests first. The calls to ReactTestUtils.Simulate.change needs some extra data to be passed: the target's name. At runtime, this property is passed to all event handlers by React.
Add that in now, as shown:
const itSubmitsNewValue = (fieldName) =>
it('saves new value when submitted', async () => {
...
await ReactTestUtils.Simulate.change(field(fieldName), {
target: { value: 'newValue', name: fieldName }
});
...
});
Test data should always be as simple as possible, by only including what's relevant for the test to pass. We omitted the name property initially because we didn't need it to make our tests pass. Now, we have an opportunity to simplify our production code, so we can include it.
Since the name of our fields is the same as the name of our customer properties, we can now destructure the event to pull out the target name, merging our event handlers into one, as shown. This uses the computed property name feature of ES6:
const handleChange = ({ target }) =>
setCustomer(customer => ({
...customer,
[target.name]: target.value
}));
推薦閱讀
- UNIX編程藝術
- JavaScript前端開發模塊化教程
- Vue.js前端開發基礎與項目實戰
- C++ Builder 6.0下OpenGL編程技術
- Hands-On RESTful Web Services with Go
- Python機器學習編程與實戰
- Terraform:多云、混合云環境下實現基礎設施即代碼(第2版)
- C++語言程序設計
- Python計算機視覺和自然語言處理
- Java EE Web應用開發基礎
- 會當凌絕頂:Java開發修行實錄
- LabVIEW數據采集
- 安卓工程師教你玩轉Android
- Microsoft Windows Identity Foundation Cookbook
- 米思齊實戰手冊:Arduino圖形化編程指南