Intro to React Native Testing Library
While we're waiting to start, if you're comfortable, share
your answer to the following question in the chat:
What do you want to learn about testing in this workshop?
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Intro to React Native Testing Library
https://rnte.st/london22
Clone the repo, build, and test!
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Josh Justice
CodingItWrong.com
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
ReactNativeTesting.io
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
What We'll Cover
— React Native Testing Library
— Jest Native
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
What We Won't Cover
— Jest basics
— End-to-end testing (Detox, Appium)
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Learning More Afterward
— https://rnte.st/london22
— Discord community
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
02 Component Tests:
Rendering
Intro to React Native Testing
Library
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
What is a component test?
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
React Native Testing Library
@testing-library/react-native
callstack.github.io/react-native-testing-library
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
What to test?
— Call methods/functions?
— Check state values?
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
"We don’t encourage reading implementation details
like state variables themselves…Instead, test observable
behavior — i.e. what your component renders or does."
-- @dan_abramov, 2019-03-06 tweet
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
"A component contract is the agreement between a
component and the rest of the application."
-- Edd Yerburgh, Testing Vue.js Applications
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
"Other components can assume the component will
fulfill its contractual agreement and produce the agreed
output if it’s provided the correct input."
-- Edd Yerburgh, Testing Vue.js Applications
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Question: what are some of the kinds of inputs and
outputs that components have?
Answer in the chat!
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
— Props
— User interaction events
Outputs:
— Rendered UI
— Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
— Props
— User interaction events
Outputs:
— Rendered UI
— Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
To the code!
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Getter Functions
— screen.getByText
— screen.getByLabelText
— screen.getByPlaceholder
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Text
return <Text>Hello, world!</Text>;
screen.getByText('Hello, world!')
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
TextInput
return <TextInput placeholder="Enter your name" ... />;
screen.getByPlaceholderText('Enter your name')
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Image
return (
<Image source={...} accessibilityLabel="squirrel waving" />
);
screen.getByLabelText('squirrel waving')
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
SVG
import WavingHand from './assets/waving-hand.svg';
return <WavingHand accessibilityLabel="waving hand" />;
screen.getByLabelText('waving hand')
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Query Functions
— screen.queryByText
— screen.queryByLabelText
— screen.queryByPlaceholder
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Which Query Should I Use?
https://callstack.github.io/react-native-testing-library/docs/how-should-i-query
"your test should resemble how users interact with your
code (component, page, etc.) as much as possible"
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Which Query Should I Use?
https://callstack.github.io/react-native-testing-library/docs/how-should-i-query
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Note on getByRole()
screen.getByRole('button', {name: 'Save Changes'})
— Likely going to be the top recommendation soon
— Feature needed first: implicit roles (Pressables
queryable as button by default)
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Confirming Presence
expect(screen.getBy…()).toBeVisible();
As of jest-native 5.1
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Confirming Presence -Alternatives
expect(screen.getBy…()).toBeTruthy();
expect(screen.queryBy…()).toBeTruthy();
screen.getBy…();
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Confirming Presence
expect(screen.getBy…()).toBeVisible();
✅
Gives best error message
✅
Looks like an expectation
✅
Does extra visibility checking for realism
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Confirming Absence
expect(screen.queryBy…()).toBeNull();
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
— Props
— User interaction events
Outputs:
— Rendered UI
— Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
— Props
— User interaction events
Outputs:
✅
Rendered UI
- Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
— Props
— User interaction events
Outputs:
✅
Rendered UI
- Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
To the code!
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
— Props
— User interaction events
Outputs:
✅
Rendered UI
- Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
✅
Props
- User interaction events
Outputs:
✅
Rendered UI
- Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Exercise 1
— intro-to-rntl-exercises
— exercises/1-Exercise1.md
For help:
reactnativetesting.io/component/testing/
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
A few more notes about testing
rendering and props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing content,
not appearance.
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
What about snapshot tests?
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
import renderer from 'react-test-renderer';
import Hello from './Hello';
it('renders correctly', () => {
const tree = renderer.create(<Hello name="Josh" />).toJSON();
expect(tree).toMatchSnapshot();
});
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
03 Component Tests:
Actions and Mocks
Intro to React Native Testing
Library
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
✅
Props
- User interaction events
Outputs:
✅
Rendered UI
- Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
✅
Props
- User interaction events
Outputs:
✅
Rendered UI
- Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
To the code!
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
import {render, fireEvent} from '@testing-library/react-native';
describe('NewMessageForm', () => {
describe('pressing send', () => {
it('clears the message field', () => {
render(<NewMessageForm />);
fireEvent.changeText(
screen.getByPlaceholderText('Message'),
'Hello world',
);
fireEvent.press(screen.getByText('Send'));
expect(screen.getByPlaceholderText('Message')).toHaveProp('value', '');
});
});
});
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
fireEvent
import {fireEvent} from '@testing-library/react-native';
fireEvent.press(element)
fireEvent.changeText(element, text)
fireEvent.scroll(element, eventData)
fireEvent(element, eventName, eventData)
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
import {render, fireEvent} from '@testing-library/react-native';
describe('NewMessageForm', () => {
describe('pressing send', () => {
it('clears the message field', () => {
render(<NewMessageForm />);
fireEvent.changeText(
screen.getByPlaceholderText('Message'),
'Hello world',
);
fireEvent.press(screen.getByText('Send'));
expect(screen.getByPlaceholderText('Message')).toHaveProp('value', '');
});
});
});
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
toHaveProp
Provided by Jest Native
expect(...).toHaveProp('propName', 'propValue');
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
✅
Props
- User interaction events
Outputs:
✅
Rendered UI
- Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
✅
Props
✅
User interaction events
Outputs:
✅
Rendered UI
- Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
✅
Props
✅
User interaction events
Outputs:
✅
Rendered UI
- Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Mock Functions
jestjs.io/docs/mock-functions
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Creating a New Mock Function
const myMockFunction = jest.fn().mockName('myMockFunction');
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Mock Matchers
expect(myMock).toHaveBeenCalled();
expect(myMock).toHaveBeenCalledWith(param, otherParam, ...);
expect(myMock).toHaveBeenCalledWith(expect.any(String));
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
To the code!
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
it('calls the send handler', () => {
const messageText = 'Hello world';
const sendHandler = jest.fn().mockName('sendHandler');
render(<NewMessageForm onSend={sendHandler} />);
fireEvent.changeText(
screen.getByPlaceholderText('Message'),
messageText,
);
fireEvent.press(screen.getByText('Send'));
expect(sendHandler).toHaveBeenCalledWith(messageText);
});
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Are mocks
Testing implementation
details?
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
No, mocks are an essential part of
Testing the contract.
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
✅
Props
✅
User interaction events
Outputs:
✅
Rendered UI
- Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
✅
Props
✅
User interaction events
Outputs:
✅
Rendered UI
✅
Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Exercise 2
— intro-to-rntl-exercises
— exercises/2-Exercise2.md
For help:
reactnativetesting.io/component/testing/#interaction
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Testing the Contract
Inputs:
— Props
— User interaction events
Outputs:
— Rendered UI
— Calls to function props
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
04 Component Tests:
Effects and Module Mocks
Intro to React Native Testing
Library
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
How can we test effects?
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
How can we test effects?
Test the effect/result.
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Data loading effects hit the API
Problem?
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Options for Mocking Web Service Requests
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Options for Mocking Web Service Requests
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Jest Module Mocks
jestjs.io/docs/mock-functions#mocking-modules
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
To the code!
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
import {render, screen} from '@testing-library/react-native';
import WidgetContainer from './WidgetContainer';
import api from './api';
jest.mock('./api');
describe('WidgetContainer', () => {
it('loads widgets upon first render', async () => {
api.get.mockResolvedValue({/* the response object */});
render(<WidgetContainer />);
await screen.findByText('Widget 1'));
expect(screen.getByText('Widget 2')).toBeVisible();
expect(api.get).toHaveBeenCalledWith('/widgets');
});
});
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
mockedModule.myfunc.mockReturnValue(val);
mockedModule.myfunc.mockResolvedValue(val);
mockedModule.myfunc.mockRejectedValue(val);
jestjs.io/docs/mock-function-api
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Getter Functions
— screen.getByText
— screen.getByLabelText
— screen.getByPlaceholder
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Find Functions
— screen.findByText
— screen.findByLabelText
— screen.findByPlaceholder
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Exercise 3
— intro-to-rntl-exercises
— exercises/3-Exercise3.md
For help:
reactnativetesting.io/component/testing.html
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
act() Error
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
To the code!
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
05 Wrap-up
Intro to React Native Testing
Library
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
What did we learn?
— What does it mean to test the contract?
— Why test the contract?
— What are the inputs and outputs of a component?
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Remaining Questions?
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Continuing the Learning
— https://rnte.st/london22
— Discord community
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
Thanks!
Josh Justice
josh.justice@testdouble.com
https://rnte.st/london22
Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22

Intro to React Native Testing Library

  • 1.
    Intro to ReactNative Testing Library While we're waiting to start, if you're comfortable, share your answer to the following question in the chat: What do you want to learn about testing in this workshop? Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 2.
    Intro to ReactNative Testing Library https://rnte.st/london22 Clone the repo, build, and test! Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 3.
    Josh Justice CodingItWrong.com Introduction toReact Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 4.
    ReactNativeTesting.io Introduction to ReactNative Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 5.
    Introduction to ReactNative Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 6.
    What We'll Cover —React Native Testing Library — Jest Native Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 7.
    What We Won'tCover — Jest basics — End-to-end testing (Detox, Appium) Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 8.
    Learning More Afterward —https://rnte.st/london22 — Discord community Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 9.
    02 Component Tests: Rendering Introto React Native Testing Library Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 10.
    What is acomponent test? Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 11.
    React Native TestingLibrary @testing-library/react-native callstack.github.io/react-native-testing-library Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 12.
    What to test? —Call methods/functions? — Check state values? Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 13.
    "We don’t encouragereading implementation details like state variables themselves…Instead, test observable behavior — i.e. what your component renders or does." -- @dan_abramov, 2019-03-06 tweet Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 14.
    Testing the Contract Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 15.
    "A component contractis the agreement between a component and the rest of the application." -- Edd Yerburgh, Testing Vue.js Applications Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 16.
    "Other components canassume the component will fulfill its contractual agreement and produce the agreed output if it’s provided the correct input." -- Edd Yerburgh, Testing Vue.js Applications Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 17.
    Question: what aresome of the kinds of inputs and outputs that components have? Answer in the chat! Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 18.
    Testing the Contract Inputs: —Props — User interaction events Outputs: — Rendered UI — Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 19.
    Testing the Contract Inputs: —Props — User interaction events Outputs: — Rendered UI — Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 20.
    To the code! Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 21.
    Getter Functions — screen.getByText —screen.getByLabelText — screen.getByPlaceholder Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 22.
    Text return <Text>Hello, world!</Text>; screen.getByText('Hello,world!') Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 23.
    TextInput return <TextInput placeholder="Enteryour name" ... />; screen.getByPlaceholderText('Enter your name') Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 24.
    Image return ( <Image source={...}accessibilityLabel="squirrel waving" /> ); screen.getByLabelText('squirrel waving') Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 25.
    SVG import WavingHand from'./assets/waving-hand.svg'; return <WavingHand accessibilityLabel="waving hand" />; screen.getByLabelText('waving hand') Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 26.
    Query Functions — screen.queryByText —screen.queryByLabelText — screen.queryByPlaceholder Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 27.
    Which Query ShouldI Use? https://callstack.github.io/react-native-testing-library/docs/how-should-i-query "your test should resemble how users interact with your code (component, page, etc.) as much as possible" Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 28.
    Which Query ShouldI Use? https://callstack.github.io/react-native-testing-library/docs/how-should-i-query Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 29.
    Note on getByRole() screen.getByRole('button',{name: 'Save Changes'}) — Likely going to be the top recommendation soon — Feature needed first: implicit roles (Pressables queryable as button by default) Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 30.
    Confirming Presence expect(screen.getBy…()).toBeVisible(); As ofjest-native 5.1 Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 31.
    Confirming Presence -Alternatives expect(screen.getBy…()).toBeTruthy(); expect(screen.queryBy…()).toBeTruthy(); screen.getBy…(); Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 32.
    Confirming Presence expect(screen.getBy…()).toBeVisible(); ✅ Gives besterror message ✅ Looks like an expectation ✅ Does extra visibility checking for realism Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 33.
    Confirming Absence expect(screen.queryBy…()).toBeNull(); Introduction toReact Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 34.
    Testing the Contract Inputs: —Props — User interaction events Outputs: — Rendered UI — Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 35.
    Testing the Contract Inputs: —Props — User interaction events Outputs: ✅ Rendered UI - Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 36.
    Testing the Contract Inputs: —Props — User interaction events Outputs: ✅ Rendered UI - Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 37.
    To the code! Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 38.
    Testing the Contract Inputs: —Props — User interaction events Outputs: ✅ Rendered UI - Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 39.
    Testing the Contract Inputs: ✅ Props -User interaction events Outputs: ✅ Rendered UI - Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 40.
    Exercise 1 — intro-to-rntl-exercises —exercises/1-Exercise1.md For help: reactnativetesting.io/component/testing/ Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 41.
    A few morenotes about testing rendering and props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 42.
    Testing content, not appearance. Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 43.
    What about snapshottests? Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 44.
    import renderer from'react-test-renderer'; import Hello from './Hello'; it('renders correctly', () => { const tree = renderer.create(<Hello name="Josh" />).toJSON(); expect(tree).toMatchSnapshot(); }); Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 45.
    03 Component Tests: Actionsand Mocks Intro to React Native Testing Library Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 46.
    Testing the Contract Inputs: ✅ Props -User interaction events Outputs: ✅ Rendered UI - Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 47.
    Testing the Contract Inputs: ✅ Props -User interaction events Outputs: ✅ Rendered UI - Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 48.
    To the code! Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 49.
    import {render, fireEvent}from '@testing-library/react-native'; describe('NewMessageForm', () => { describe('pressing send', () => { it('clears the message field', () => { render(<NewMessageForm />); fireEvent.changeText( screen.getByPlaceholderText('Message'), 'Hello world', ); fireEvent.press(screen.getByText('Send')); expect(screen.getByPlaceholderText('Message')).toHaveProp('value', ''); }); }); }); Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 50.
    fireEvent import {fireEvent} from'@testing-library/react-native'; fireEvent.press(element) fireEvent.changeText(element, text) fireEvent.scroll(element, eventData) fireEvent(element, eventName, eventData) Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 51.
    import {render, fireEvent}from '@testing-library/react-native'; describe('NewMessageForm', () => { describe('pressing send', () => { it('clears the message field', () => { render(<NewMessageForm />); fireEvent.changeText( screen.getByPlaceholderText('Message'), 'Hello world', ); fireEvent.press(screen.getByText('Send')); expect(screen.getByPlaceholderText('Message')).toHaveProp('value', ''); }); }); }); Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 52.
    toHaveProp Provided by JestNative expect(...).toHaveProp('propName', 'propValue'); Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 53.
    Testing the Contract Inputs: ✅ Props -User interaction events Outputs: ✅ Rendered UI - Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 54.
    Testing the Contract Inputs: ✅ Props ✅ Userinteraction events Outputs: ✅ Rendered UI - Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 55.
    Testing the Contract Inputs: ✅ Props ✅ Userinteraction events Outputs: ✅ Rendered UI - Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 56.
    Mock Functions jestjs.io/docs/mock-functions Introduction toReact Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 57.
    Creating a NewMock Function const myMockFunction = jest.fn().mockName('myMockFunction'); Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 58.
    Mock Matchers expect(myMock).toHaveBeenCalled(); expect(myMock).toHaveBeenCalledWith(param, otherParam,...); expect(myMock).toHaveBeenCalledWith(expect.any(String)); Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 59.
    To the code! Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 60.
    it('calls the sendhandler', () => { const messageText = 'Hello world'; const sendHandler = jest.fn().mockName('sendHandler'); render(<NewMessageForm onSend={sendHandler} />); fireEvent.changeText( screen.getByPlaceholderText('Message'), messageText, ); fireEvent.press(screen.getByText('Send')); expect(sendHandler).toHaveBeenCalledWith(messageText); }); Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 61.
    Are mocks Testing implementation details? Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 62.
    No, mocks arean essential part of Testing the contract. Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 63.
    Testing the Contract Inputs: ✅ Props ✅ Userinteraction events Outputs: ✅ Rendered UI - Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 64.
    Testing the Contract Inputs: ✅ Props ✅ Userinteraction events Outputs: ✅ Rendered UI ✅ Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 65.
    Exercise 2 — intro-to-rntl-exercises —exercises/2-Exercise2.md For help: reactnativetesting.io/component/testing/#interaction Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 66.
    Testing the Contract Inputs: —Props — User interaction events Outputs: — Rendered UI — Calls to function props Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 67.
    04 Component Tests: Effectsand Module Mocks Intro to React Native Testing Library Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 68.
    How can wetest effects? Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 69.
    How can wetest effects? Test the effect/result. Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 70.
    Data loading effectshit the API Problem? Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 71.
    Options for MockingWeb Service Requests Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 72.
    Options for MockingWeb Service Requests Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 73.
    Jest Module Mocks jestjs.io/docs/mock-functions#mocking-modules Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 74.
    To the code! Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 75.
    import {render, screen}from '@testing-library/react-native'; import WidgetContainer from './WidgetContainer'; import api from './api'; jest.mock('./api'); describe('WidgetContainer', () => { it('loads widgets upon first render', async () => { api.get.mockResolvedValue({/* the response object */}); render(<WidgetContainer />); await screen.findByText('Widget 1')); expect(screen.getByText('Widget 2')).toBeVisible(); expect(api.get).toHaveBeenCalledWith('/widgets'); }); }); Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 76.
  • 77.
    Getter Functions — screen.getByText —screen.getByLabelText — screen.getByPlaceholder Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 78.
    Find Functions — screen.findByText —screen.findByLabelText — screen.findByPlaceholder Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 79.
    Exercise 3 — intro-to-rntl-exercises —exercises/3-Exercise3.md For help: reactnativetesting.io/component/testing.html Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 80.
    act() Error Introduction toReact Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 81.
    To the code! Introductionto React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 82.
    05 Wrap-up Intro toReact Native Testing Library Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 83.
    What did welearn? — What does it mean to test the contract? — Why test the contract? — What are the inputs and outputs of a component? Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 84.
    Remaining Questions? Introduction toReact Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 85.
    Continuing the Learning —https://rnte.st/london22 — Discord community Introduction to React Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 86.
    Introduction to ReactNative Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22
  • 87.
    Thanks! Josh Justice josh.justice@testdouble.com https://rnte.st/london22 Introduction toReact Native Testing Library - Josh Justice - React Advanced London - 2022-10-28 - https://rnte.st/london22