I don’t understand the result I get on this unit test. I expect the second check for textField.valid to be true and instead it returns false.
Below is part of the component I’m testing against:
export const FeedbackForm = ({ closeFunc }) => {
const [response, setResponse] = useState(false)
const [name, changeName] = useState('')
const [email, changeEmail] = useState('')
const [feedback, changeFeedback] = useState('')
const [patching, setPatching] = useState(false)
const emailRegex = /^[w-.]+@([w-]+.)+[w-]{2,4}$/g
…
<TextField
id='name'
label='Name'
defaultValue={name}
onChange={(event) => {
changeName(event.target.value)
}}
disabled={patching}
valid={name !== ''}
warning='Name cannot be blank.'
/>
Below is the test I’m running:
test('should validate the name field', () => {
const wrapper = shallow(<FeedbackForm />)
const textField = wrapper.findWhere((el) => el.type() === TextField && el.props().id === 'name')
expect((textField).prop('valid')).toBe(false)
textField.props().onChange({
target: {
name: 'changeName',
value: 'Dude Man',
},
})
console.log(wrapper.debug())
expect((textField).prop('valid')).toBe(true)
})
The output of console.log(wrapper.debug()) is the following:
<form onSubmit={[Function: handleSubmit]} noValidate={true}>
<TextField id="name" label="Name" defaultValue="Dude Man" onChange={[Function: onChange]} disabled={false} valid={true} warning="Name cannot be blank." />
So why does the test fail?
Advertisement
Answer
The problem was that I needed to change the declaration to let textField = wrapper.findWhere((el) => el.type() === TextField && el.props().id === 'name') and then redeclare textField
textField = wrapper.findWhere((el) => el.type() === TextField && el.props().id === 'name')
to update the value in the DOM