@testing-library/react-native 12.5.0 → 12.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -63
- package/build/render.js +4 -3
- package/build/render.js.map +1 -1
- package/package.json +4 -5
package/README.md
CHANGED
|
@@ -6,17 +6,15 @@
|
|
|
6
6
|
alt="owl"
|
|
7
7
|
src="https://raw.githubusercontent.com/callstack/react-native-testing-library/main/website/static/img/owl.png"
|
|
8
8
|
/>
|
|
9
|
-
<p>
|
|
9
|
+
<p>Developer-friendly and complete React Native testing utilities that encourage good testing practices.</P>
|
|
10
10
|
</div>
|
|
11
11
|
|
|
12
|
-
![Version][version-badge]
|
|
13
|
-
![
|
|
14
|
-
![
|
|
15
|
-
[![downloads
|
|
16
|
-
![
|
|
17
|
-
[![
|
|
18
|
-
![Sponsored by Callstack][callstack-badge]
|
|
19
|
-
[](https://github.com/callstack/react-native-testing-library/stargazers)
|
|
12
|
+
[![Version][version-badge]][package]
|
|
13
|
+
[![Build Status][build-badge]][build]
|
|
14
|
+
[![Code Coverage][coverage-badge]][coverage]
|
|
15
|
+
[![Downloads][downloads-badge]][downloads]
|
|
16
|
+
[![MIT License][license-badge]][license]
|
|
17
|
+
[![Sponsored by Callstack][callstack-badge]][callstack]
|
|
20
18
|
|
|
21
19
|
## The problem
|
|
22
20
|
|
|
@@ -24,7 +22,7 @@ You want to write maintainable tests for your React Native components. As a part
|
|
|
24
22
|
|
|
25
23
|
## This solution
|
|
26
24
|
|
|
27
|
-
The React Native Testing Library (RNTL) is a
|
|
25
|
+
The React Native Testing Library (RNTL) is a comprehensive solution for testing React Native components. It provides React Native runtime simulation on top of `react-test-renderer`, in a way that encourages better testing practices. Its primary guiding principle is:
|
|
28
26
|
|
|
29
27
|
> The more your tests resemble the way your software is used, the more confidence they can give you.
|
|
30
28
|
|
|
@@ -34,19 +32,15 @@ This project is inspired by [React Testing Library](https://github.com/testing-l
|
|
|
34
32
|
|
|
35
33
|
Open a Terminal in your project's folder and run:
|
|
36
34
|
|
|
37
|
-
#### Using `yarn`
|
|
38
|
-
|
|
39
35
|
```sh
|
|
36
|
+
# Yarn install:
|
|
40
37
|
yarn add --dev @testing-library/react-native
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
#### Using `npm`
|
|
44
38
|
|
|
45
|
-
|
|
39
|
+
# NPM install
|
|
46
40
|
npm install --save-dev @testing-library/react-native
|
|
47
41
|
```
|
|
48
42
|
|
|
49
|
-
This library has a `peerDependencies` listing for `react-test-renderer`. Make sure that your `react-test-renderer` version matches exactly the `react` version.
|
|
43
|
+
This library has a `peerDependencies` listing for `react-test-renderer`. Make sure that your `react-test-renderer` version matches exactly the `react` version, avoid using `^` in version number.
|
|
50
44
|
|
|
51
45
|
### Additional Jest matchers
|
|
52
46
|
|
|
@@ -56,32 +50,6 @@ You can use the built-in Jest matchers by adding the following line to your `jes
|
|
|
56
50
|
import '@testing-library/react-native/extend-expect';
|
|
57
51
|
```
|
|
58
52
|
|
|
59
|
-
### Custom Jest Preset (React Native before 0.71)
|
|
60
|
-
|
|
61
|
-
We generally advise using the "react-native" preset when testing with this library.
|
|
62
|
-
|
|
63
|
-
However, if you use React Native version earlier than 0.71 with [modern Jest fake timers](https://jestjs.io/blog/2020/05/05/jest-26#new-fake-timers) (default since Jest 27), you'll need to apply this custom Jest preset or otherwise awaiting promises, like using `waitFor` or `findBy*`, queries will fail with a timeout.
|
|
64
|
-
|
|
65
|
-
This is a [known issue](https://github.com/facebook/react-native/issues/29303). It happens because React Native's Jest preset overrides native Promise. Our preset restores it to defaults, which is not a problem in most apps out there.
|
|
66
|
-
|
|
67
|
-
Here's how you apply a custom preset in your Jest config:
|
|
68
|
-
|
|
69
|
-
```json
|
|
70
|
-
{
|
|
71
|
-
"preset": "@testing-library/react-native"
|
|
72
|
-
}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
If this doesn't work for you, please fall back to using "legacy" fake timers.
|
|
76
|
-
|
|
77
|
-
### Flow
|
|
78
|
-
|
|
79
|
-
Note for [Flow](https://flow.org) users – you'll also need to install typings for `react-test-renderer`:
|
|
80
|
-
|
|
81
|
-
```sh
|
|
82
|
-
flow-typed install react-test-renderer
|
|
83
|
-
```
|
|
84
|
-
|
|
85
53
|
## Example
|
|
86
54
|
|
|
87
55
|
```jsx
|
|
@@ -119,24 +87,26 @@ You can find the source of `QuestionsBoard` component and this example [here](ht
|
|
|
119
87
|
|
|
120
88
|
## API / Usage
|
|
121
89
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
- [`render`](https://callstack.github.io/react-native-testing-library/docs/render)
|
|
125
|
-
- [`screen`](https://callstack.github.io/react-native-testing-library/docs/screen)
|
|
126
|
-
- [
|
|
127
|
-
- [`
|
|
128
|
-
- [
|
|
129
|
-
- [
|
|
130
|
-
- [
|
|
131
|
-
- [
|
|
90
|
+
React Native Testing Library consists of following APIs:
|
|
91
|
+
|
|
92
|
+
- [`render` function](https://callstack.github.io/react-native-testing-library/docs/render) - render your UI components for testing purposes
|
|
93
|
+
- [`screen` object](https://callstack.github.io/react-native-testing-library/docs/screen) - access rendered UI:
|
|
94
|
+
- [Queries](https://callstack.github.io/react-native-testing-library/docs/queries) - find rendered components by various predicates: role, text, test ids, etc
|
|
95
|
+
- Lifecycle methods: [`rerender`](https://callstack.github.io/react-native-testing-library/docs/screen#rerender), [`unmount`](https://callstack.github.io/react-native-testing-library/docs/screen#unmount)
|
|
96
|
+
- Helpers: [`debug`](https://callstack.github.io/react-native-testing-library/docs/screen#debug), [`toJSON`](https://callstack.github.io/react-native-testing-library/docs/screen#tojson), [`root`](https://callstack.github.io/react-native-testing-library/docs/screen#root)
|
|
97
|
+
- [Jest matchers](https://callstack.github.io/react-native-testing-library/docs/jest-matchers) - validate assumptions about your UI
|
|
98
|
+
- [User Event](https://callstack.github.io/react-native-testing-library/docs/user-event) - simulate common user interactions like [`press`](https://callstack.github.io/react-native-testing-library/docs/user-event#press) or [`type`](https://callstack.github.io/react-native-testing-library/docs/user-event#type) in a realistic way
|
|
99
|
+
- [Fire Event](https://callstack.github.io/react-native-testing-library/docs/fire-event) - simulate any component event in a simplified way
|
|
100
|
+
- [`renderHook` function](https://callstack.github.io/react-native-testing-library/docs/render-hook) - render hooks for testing purposes
|
|
101
|
+
- [Other APIs](https://callstack.github.io/react-native-testing-library/docs/other):
|
|
102
|
+
- [Async utils](https://callstack.github.io/react-native-testing-library/docs/other#async-utilities): `findBy*` queries, `waitFor`, `waitForElementToBeRemoved`
|
|
103
|
+
- [Configuration](https://callstack.github.io/react-native-testing-library/docs/other#configuration): `configure`, `resetToDefaults`
|
|
104
|
+
- [Accessibility](https://callstack.github.io/react-native-testing-library/docs/other#accessibility): `isHiddenFromAccessibility`
|
|
105
|
+
- [Other](https://callstack.github.io/react-native-testing-library/docs/other#other-helpers): `within`, `act`, `cleanup`
|
|
132
106
|
|
|
133
107
|
## Migration Guides
|
|
134
108
|
|
|
135
109
|
- [Migration to 12.0](https://callstack.github.io/react-native-testing-library/docs/migration-v12)
|
|
136
|
-
- [Migration to 11.0](https://callstack.github.io/react-native-testing-library/docs/migration-v11)
|
|
137
|
-
- [Migration to 9.0](https://callstack.github.io/react-native-testing-library/docs/migration-v9)
|
|
138
|
-
- [Migration to 7.0](https://callstack.github.io/react-native-testing-library/docs/migration-v7)
|
|
139
|
-
- [Migration to 2.0](https://callstack.github.io/react-native-testing-library/docs/migration-v2)
|
|
140
110
|
|
|
141
111
|
## Troubleshooting
|
|
142
112
|
|
|
@@ -160,11 +130,13 @@ Supported and used by [Rally Health](https://www.rallyhealth.com/careers).
|
|
|
160
130
|
|
|
161
131
|
[version-badge]: https://img.shields.io/npm/v/@testing-library/react-native.svg?style=flat-square
|
|
162
132
|
[package]: https://www.npmjs.com/package/@testing-library/react-native
|
|
163
|
-
[
|
|
164
|
-
[
|
|
165
|
-
[
|
|
166
|
-
[
|
|
133
|
+
[build-badge]: https://github.com/callstack/react-native-testing-library/actions/workflows/ci.yml/badge.svg
|
|
134
|
+
[build]: https://github.com/callstack/react-native-testing-library/actions/workflows/ci.yml
|
|
135
|
+
[coverage-badge]: https://img.shields.io/codecov/c/github/callstack/react-native-testing-library.svg
|
|
136
|
+
[coverage]: https://codecov.io/github/callstack/react-native-testing-library
|
|
137
|
+
[downloads-badge]: https://img.shields.io/npm/dm/@testing-library/react-native.svg?style=flat-square
|
|
138
|
+
[downloads]: http://www.npmtrends.com/@testing-library/react-native
|
|
139
|
+
[license-badge]: https://img.shields.io/npm/l/@testing-library/react-native.svg
|
|
140
|
+
[license]: https://opensource.org/licenses/MIT
|
|
167
141
|
[callstack-badge]: https://callstack.com/images/callstack-badge.svg
|
|
168
142
|
[callstack]: https://callstack.com/open-source/?utm_source=github.com&utm_medium=referral&utm_campaign=react-native-testing-library&utm_term=readme
|
|
169
|
-
[codecov-badge]: https://codecov.io/gh/callstack/react-native-testing-library/branch/main/graph/badge.svg?token=tYVSWro1IP
|
|
170
|
-
[codecov]: https://codecov.io/gh/callstack/react-native-testing-library
|
package/build/render.js
CHANGED
|
@@ -49,20 +49,21 @@ function renderInternal(component, options) {
|
|
|
49
49
|
return buildRenderResult(renderer, wrap);
|
|
50
50
|
}
|
|
51
51
|
function renderWithStringValidation(component, options = {}) {
|
|
52
|
+
let renderer;
|
|
52
53
|
const {
|
|
53
54
|
wrapper: Wrapper,
|
|
54
55
|
...testRendererOptions
|
|
55
56
|
} = options ?? {};
|
|
56
57
|
const handleRender = (_, phase) => {
|
|
57
|
-
if (phase === 'update') {
|
|
58
|
-
(0, _stringValidation.validateStringsRenderedWithinText)(
|
|
58
|
+
if (renderer && phase === 'update') {
|
|
59
|
+
(0, _stringValidation.validateStringsRenderedWithinText)(renderer.toJSON());
|
|
59
60
|
}
|
|
60
61
|
};
|
|
61
62
|
const wrap = element => /*#__PURE__*/React.createElement(_react.Profiler, {
|
|
62
63
|
id: "renderProfiler",
|
|
63
64
|
onRender: handleRender
|
|
64
65
|
}, Wrapper ? /*#__PURE__*/React.createElement(Wrapper, null, element) : element);
|
|
65
|
-
|
|
66
|
+
renderer = (0, _renderAct.renderWithAct)(wrap(component), testRendererOptions);
|
|
66
67
|
(0, _stringValidation.validateStringsRenderedWithinText)(renderer.toJSON());
|
|
67
68
|
return buildRenderResult(renderer, wrap);
|
|
68
69
|
}
|
package/build/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","names":["_react","_interopRequireWildcard","require","React","_act","_interopRequireDefault","_cleanup","_config","_componentTree","_debugDeep","_debugShallow","_hostComponentNames","_stringValidation","_renderAct","_screen","_within","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","render","component","options","renderInternal","wrapper","Wrapper","detectHostComponentNames","unstable_validateStringsRenderedWithinText","testRendererOptions","configureHostComponentNamesIfNeeded","renderWithStringValidation","wrap","element","createElement","renderer","renderWithAct","buildRenderResult","handleRender","_","phase","validateStringsRenderedWithinText","screen","toJSON","Profiler","id","onRender","update","updateWithAct","instance","root","unmount","act","addToCleanupQueue","result","getQueriesForElement","rerender","debug","getHostChildren","UNSAFE_root","enumerable","Error","setRenderResult","debugImpl","defaultDebugOptions","getConfig","debugOptions","message","console","warn","json","debugDeep","shallow","debugShallow"],"sources":["../src/render.tsx"],"sourcesContent":["import type { ReactTestInstance, ReactTestRenderer } from 'react-test-renderer';\nimport * as React from 'react';\nimport { Profiler } from 'react';\nimport act from './act';\nimport { addToCleanupQueue } from './cleanup';\nimport { getConfig } from './config';\nimport { getHostChildren } from './helpers/component-tree';\nimport debugDeep, { DebugOptions } from './helpers/debug-deep';\nimport debugShallow from './helpers/debug-shallow';\nimport { configureHostComponentNamesIfNeeded } from './helpers/host-component-names';\nimport { validateStringsRenderedWithinText } from './helpers/string-validation';\nimport { renderWithAct } from './render-act';\nimport { setRenderResult, screen } from './screen';\nimport { getQueriesForElement } from './within';\n\nexport interface RenderOptions {\n wrapper?: React.ComponentType<any>;\n createNodeMock?: (element: React.ReactElement) => unknown;\n unstable_validateStringsRenderedWithinText?: boolean;\n}\n\nexport type RenderResult = ReturnType<typeof render>;\n\n/**\n * Renders test component deeply using React Test Renderer and exposes helpers\n * to assert on the output.\n */\nexport default function render<T>(component: React.ReactElement<T>, options: RenderOptions = {}) {\n return renderInternal(component, options);\n}\n\nexport interface RenderInternalOptions extends RenderOptions {\n detectHostComponentNames?: boolean;\n}\n\nexport function renderInternal<T>(\n component: React.ReactElement<T>,\n options?: RenderInternalOptions,\n) {\n const {\n wrapper: Wrapper,\n detectHostComponentNames = true,\n unstable_validateStringsRenderedWithinText,\n ...testRendererOptions\n } = options || {};\n\n if (detectHostComponentNames) {\n configureHostComponentNamesIfNeeded();\n }\n\n if (unstable_validateStringsRenderedWithinText) {\n return renderWithStringValidation(component, {\n wrapper: Wrapper,\n ...testRendererOptions,\n });\n }\n\n const wrap = (element: React.ReactElement) => (Wrapper ? <Wrapper>{element}</Wrapper> : element);\n const renderer = renderWithAct(wrap(component), testRendererOptions);\n return buildRenderResult(renderer, wrap);\n}\n\nfunction renderWithStringValidation<T>(\n component: React.ReactElement<T>,\n options: Omit<RenderOptions, 'unstable_validateStringsRenderedWithinText'> = {},\n) {\n const { wrapper: Wrapper, ...testRendererOptions } = options ?? {};\n\n const handleRender: React.ProfilerProps['onRender'] = (_, phase) => {\n if (phase === 'update') {\n validateStringsRenderedWithinText(screen.toJSON());\n }\n };\n\n const wrap = (element: React.ReactElement) => (\n <Profiler id=\"renderProfiler\" onRender={handleRender}>\n {Wrapper ? <Wrapper>{element}</Wrapper> : element}\n </Profiler>\n );\n\n const renderer = renderWithAct(wrap(component), testRendererOptions);\n validateStringsRenderedWithinText(renderer.toJSON());\n\n return buildRenderResult(renderer, wrap);\n}\n\nfunction buildRenderResult(\n renderer: ReactTestRenderer,\n wrap: (element: React.ReactElement) => JSX.Element,\n) {\n const update = updateWithAct(renderer, wrap);\n const instance = renderer.root;\n\n const unmount = () => {\n void act(() => {\n renderer.unmount();\n });\n };\n\n addToCleanupQueue(unmount);\n\n const result = {\n ...getQueriesForElement(instance),\n update,\n unmount,\n rerender: update, // alias for `update`\n toJSON: renderer.toJSON,\n debug: debug(instance, renderer),\n get root(): ReactTestInstance {\n return getHostChildren(instance)[0];\n },\n UNSAFE_root: instance,\n };\n\n // Add as non-enumerable property, so that it's safe to enumerate\n // `render` result, e.g. using destructuring rest syntax.\n Object.defineProperty(result, 'container', {\n enumerable: false,\n get() {\n throw new Error(\n \"'container' property has been renamed to 'UNSAFE_root'.\\n\\n\" +\n \"Consider using 'root' property which returns root host element.\",\n );\n },\n });\n\n setRenderResult(result);\n return result;\n}\n\nfunction updateWithAct(\n renderer: ReactTestRenderer,\n wrap: (innerElement: React.ReactElement) => React.ReactElement,\n) {\n return function (component: React.ReactElement) {\n void act(() => {\n renderer.update(wrap(component));\n });\n };\n}\n\nexport interface DebugFunction {\n (options?: DebugOptions | string): void;\n shallow: (message?: string) => void;\n}\n\nfunction debug(instance: ReactTestInstance, renderer: ReactTestRenderer): DebugFunction {\n function debugImpl(options?: DebugOptions | string) {\n const { defaultDebugOptions } = getConfig();\n const debugOptions =\n typeof options === 'string'\n ? { ...defaultDebugOptions, message: options }\n : { ...defaultDebugOptions, ...options };\n\n if (typeof options === 'string') {\n // eslint-disable-next-line no-console\n console.warn(\n 'Using debug(\"message\") is deprecated and will be removed in future release, please use debug({ message; \"message\" }) instead.',\n );\n }\n\n const json = renderer.toJSON();\n if (json) {\n return debugDeep(json, debugOptions);\n }\n }\n debugImpl.shallow = (message?: string) => debugShallow(instance, message);\n return debugImpl;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"render.js","names":["_react","_interopRequireWildcard","require","React","_act","_interopRequireDefault","_cleanup","_config","_componentTree","_debugDeep","_debugShallow","_hostComponentNames","_stringValidation","_renderAct","_screen","_within","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","render","component","options","renderInternal","wrapper","Wrapper","detectHostComponentNames","unstable_validateStringsRenderedWithinText","testRendererOptions","configureHostComponentNamesIfNeeded","renderWithStringValidation","wrap","element","createElement","renderer","renderWithAct","buildRenderResult","handleRender","_","phase","validateStringsRenderedWithinText","toJSON","Profiler","id","onRender","update","updateWithAct","instance","root","unmount","act","addToCleanupQueue","result","getQueriesForElement","rerender","debug","getHostChildren","UNSAFE_root","enumerable","Error","setRenderResult","debugImpl","defaultDebugOptions","getConfig","debugOptions","message","console","warn","json","debugDeep","shallow","debugShallow"],"sources":["../src/render.tsx"],"sourcesContent":["import type { ReactTestInstance, ReactTestRenderer } from 'react-test-renderer';\nimport * as React from 'react';\nimport { Profiler } from 'react';\nimport act from './act';\nimport { addToCleanupQueue } from './cleanup';\nimport { getConfig } from './config';\nimport { getHostChildren } from './helpers/component-tree';\nimport debugDeep, { DebugOptions } from './helpers/debug-deep';\nimport debugShallow from './helpers/debug-shallow';\nimport { configureHostComponentNamesIfNeeded } from './helpers/host-component-names';\nimport { validateStringsRenderedWithinText } from './helpers/string-validation';\nimport { renderWithAct } from './render-act';\nimport { setRenderResult } from './screen';\nimport { getQueriesForElement } from './within';\n\nexport interface RenderOptions {\n wrapper?: React.ComponentType<any>;\n createNodeMock?: (element: React.ReactElement) => unknown;\n unstable_validateStringsRenderedWithinText?: boolean;\n}\n\nexport type RenderResult = ReturnType<typeof render>;\n\n/**\n * Renders test component deeply using React Test Renderer and exposes helpers\n * to assert on the output.\n */\nexport default function render<T>(component: React.ReactElement<T>, options: RenderOptions = {}) {\n return renderInternal(component, options);\n}\n\nexport interface RenderInternalOptions extends RenderOptions {\n detectHostComponentNames?: boolean;\n}\n\nexport function renderInternal<T>(\n component: React.ReactElement<T>,\n options?: RenderInternalOptions,\n) {\n const {\n wrapper: Wrapper,\n detectHostComponentNames = true,\n unstable_validateStringsRenderedWithinText,\n ...testRendererOptions\n } = options || {};\n\n if (detectHostComponentNames) {\n configureHostComponentNamesIfNeeded();\n }\n\n if (unstable_validateStringsRenderedWithinText) {\n return renderWithStringValidation(component, {\n wrapper: Wrapper,\n ...testRendererOptions,\n });\n }\n\n const wrap = (element: React.ReactElement) => (Wrapper ? <Wrapper>{element}</Wrapper> : element);\n const renderer = renderWithAct(wrap(component), testRendererOptions);\n return buildRenderResult(renderer, wrap);\n}\n\nfunction renderWithStringValidation<T>(\n component: React.ReactElement<T>,\n options: Omit<RenderOptions, 'unstable_validateStringsRenderedWithinText'> = {},\n) {\n let renderer: ReactTestRenderer;\n const { wrapper: Wrapper, ...testRendererOptions } = options ?? {};\n\n const handleRender: React.ProfilerOnRenderCallback = (_, phase) => {\n if (renderer && phase === 'update') {\n validateStringsRenderedWithinText(renderer.toJSON());\n }\n };\n\n const wrap = (element: React.ReactElement) => (\n <Profiler id=\"renderProfiler\" onRender={handleRender}>\n {Wrapper ? <Wrapper>{element}</Wrapper> : element}\n </Profiler>\n );\n\n renderer = renderWithAct(wrap(component), testRendererOptions);\n\n validateStringsRenderedWithinText(renderer.toJSON());\n\n return buildRenderResult(renderer, wrap);\n}\n\nfunction buildRenderResult(\n renderer: ReactTestRenderer,\n wrap: (element: React.ReactElement) => JSX.Element,\n) {\n const update = updateWithAct(renderer, wrap);\n const instance = renderer.root;\n\n const unmount = () => {\n void act(() => {\n renderer.unmount();\n });\n };\n\n addToCleanupQueue(unmount);\n\n const result = {\n ...getQueriesForElement(instance),\n update,\n unmount,\n rerender: update, // alias for `update`\n toJSON: renderer.toJSON,\n debug: debug(instance, renderer),\n get root(): ReactTestInstance {\n return getHostChildren(instance)[0];\n },\n UNSAFE_root: instance,\n };\n\n // Add as non-enumerable property, so that it's safe to enumerate\n // `render` result, e.g. using destructuring rest syntax.\n Object.defineProperty(result, 'container', {\n enumerable: false,\n get() {\n throw new Error(\n \"'container' property has been renamed to 'UNSAFE_root'.\\n\\n\" +\n \"Consider using 'root' property which returns root host element.\",\n );\n },\n });\n\n setRenderResult(result);\n return result;\n}\n\nfunction updateWithAct(\n renderer: ReactTestRenderer,\n wrap: (innerElement: React.ReactElement) => React.ReactElement,\n) {\n return function (component: React.ReactElement) {\n void act(() => {\n renderer.update(wrap(component));\n });\n };\n}\n\nexport interface DebugFunction {\n (options?: DebugOptions | string): void;\n shallow: (message?: string) => void;\n}\n\nfunction debug(instance: ReactTestInstance, renderer: ReactTestRenderer): DebugFunction {\n function debugImpl(options?: DebugOptions | string) {\n const { defaultDebugOptions } = getConfig();\n const debugOptions =\n typeof options === 'string'\n ? { ...defaultDebugOptions, message: options }\n : { ...defaultDebugOptions, ...options };\n\n if (typeof options === 'string') {\n // eslint-disable-next-line no-console\n console.warn(\n 'Using debug(\"message\") is deprecated and will be removed in future release, please use debug({ message; \"message\" }) instead.',\n );\n }\n\n const json = renderer.toJSON();\n if (json) {\n return debugDeep(json, debugOptions);\n }\n }\n debugImpl.shallow = (message?: string) => debugShallow(instance, message);\n return debugImpl;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testing-library/react-native",
|
|
3
|
-
"version": "12.5.
|
|
3
|
+
"version": "12.5.1",
|
|
4
4
|
"description": "Simple and complete React Native testing utilities that encourage good testing practices.",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -9,9 +9,8 @@
|
|
|
9
9
|
"url": "https://www.github.com/callstack/react-native-testing-library.git"
|
|
10
10
|
},
|
|
11
11
|
"homepage": "https://callstack.github.io/react-native-testing-library",
|
|
12
|
-
"author": "Michał Pierzchała <thymikee@gmail.com>",
|
|
12
|
+
"author": "Michał Pierzchała <thymikee@gmail.com> (https://github.com/thymikee), Maciej Jastrzębski <mdjastrzebski@gmail.com> (https://github.com/mdjastrzebski)",
|
|
13
13
|
"contributors": [
|
|
14
|
-
"Maciej Jastrzębski <mdjastrzebski@gmail.com> (https://github.com/mdjastrzebski)",
|
|
15
14
|
"Augustin Le Fèvre <augustin.le-fevre@klarna.com> (https://github.com/AugustinLF)",
|
|
16
15
|
"Pierre Zimmermann <pierrez@nam.tech> (https://github.com/pierrezimmermannbam)",
|
|
17
16
|
"MattAgn <matthieua@bam.tech> (https://github.com/MattAgn)"
|
|
@@ -91,7 +90,7 @@
|
|
|
91
90
|
"jest": "^29.7.0",
|
|
92
91
|
"prettier": "^2.8.8",
|
|
93
92
|
"react": "18.2.0",
|
|
94
|
-
"react-native": "0.74.
|
|
93
|
+
"react-native": "0.74.1",
|
|
95
94
|
"react-test-renderer": "18.2.0",
|
|
96
95
|
"release-it": "^17.2.1",
|
|
97
96
|
"strip-ansi": "^6.0.1",
|
|
@@ -100,5 +99,5 @@
|
|
|
100
99
|
"publishConfig": {
|
|
101
100
|
"registry": "https://registry.npmjs.org"
|
|
102
101
|
},
|
|
103
|
-
"packageManager": "yarn@4.
|
|
102
|
+
"packageManager": "yarn@4.2.1"
|
|
104
103
|
}
|