Skip to main content
Version: 7.0.0

Testing

Testkits allows us to test components without knowing the internal implementation, making it easier to test and reduce over head from migrations and changes in implementation. For example:

  • Changing the input of a TextField component can be done using the driver's changeText
  • Pressing a button could be achieved using the Button driver's press function.

How to use the testkits​

Initializing the driver​

In order to initialize a test driver you pass it the renderTree and the component's testId as an object.

Example​

Suppose we have a form that takes a first name, last name and an address and we want to test the submitting of this form. Our form component will look something like this:

import {Button, TextField, View} from 'react-native-ui-lib/testkit';

type OnSubmitHandler = (firstName: string, lastName: string, address: string) => void;
const MyForm = (props: {onSubmit: OnSubmitHandler}) => {
const {onSubmit} = props;
const [firstName, setFirstName] = useState('');
const [lastName, setLastName] = useState('');
const [address, setAddress] = useState('');
return (
<View>
<TextField label="First name" onChangeText={(value) => setFirstName(value)} value={firstName}/>
<TextField label="Last name" onChangeText={(value) => setLastName(value)} value={lastName}/>
<TextField label="Address" onChangeText={(value) => setAddress(value)} value={address}/>
<Button label="Submit" onPress={() => onSubmit(firstName, lastName, address)}/>
</View>
);
};

Testing our flow​

In order to test our flow we would do the following steps:​

  1. Import the TextField and Button driver from UI-LIB's testkit
import {TextFieldDriver, ButtonDriver} from 'react-native-ui-lib/testkit';
  1. render our test case
const renderTree = render(<MyForm onSubmit={onSubmit}/>);
  1. Initialize our drivers for the TextFields and submit button
const firstNameDriver = TextFieldDriver({renderTree, testID: 'firstName'});
const lastNameDriver = TextFieldDriver({renderTree, testID: 'lastName'});
const addressDriver = TextFieldDriver({renderTree, testID: 'address'});
const submitBtnDriver = ButtonDriver({renderTree, testID: 'submit'});
  1. Change the text of the fields and submit the form.
firstNameDriver.changeText('Musa');
lastNameDriver.changeText('The Man');
addressDriver.changeText('Yunitzman 5');
submitBtnDriver.press();
  1. Check that the correct values were passed to the submit handler
expect(onSubmit).toHaveBeenCalledWith('Musa', 'The Man', 'Yunitzman 5');
Full test
describe('My Form', () => {
it('should submit MyForm with Musa The Man, Yunitzman 5', () => {
const onSubmit = jest.fn();
const renderTree = render(<MyForm onSubmit={onSubmit}/>);
const firstNameDriver = TextFieldDriver({renderTree, testID: 'firstName'});
const lastNameDriver = TextFieldDriver({renderTree, testID: 'lastName'});
const addressDriver = TextFieldDriver({renderTree, testID: 'address'});
const submitBtnDriver = ButtonDriver({renderTree, testID: 'submit'});
firstNameDriver.changeText('Musa');
lastNameDriver.changeText('The Man');
addressDriver.changeText('Yunitzman 5');
submitBtnDriver.press();
expect(onSubmit).toHaveBeenCalledWith('Musa', 'The Man', 'Yunitzman 5');
});
});