diff --git a/package.json b/package.json
index 4668ca109..00566f77c 100644
--- a/package.json
+++ b/package.json
@@ -56,6 +56,7 @@
},
"peerDependencies": {
"react": ">=16.0.0",
+ "react-native": ">=0.59",
"react-test-renderer": ">=16.0.0"
},
"scripts": {
diff --git a/src/__tests__/render.test.js b/src/__tests__/render.test.js
index ebf846967..a1d8d0c0d 100644
--- a/src/__tests__/render.test.js
+++ b/src/__tests__/render.test.js
@@ -382,3 +382,29 @@ test('renders options.wrapper around updated node', () => {
`);
});
+
+test('returns container', () => {
+ const { container } = render();
+
+ expect(container).toBeDefined();
+ // `View` composite component is returned. This behavior will break if we
+ // start returning only host components.
+ expect(container.type).toBe(View);
+ expect(container.props.testID).toBe('inner');
+});
+
+test('returns wrapped component as container', () => {
+ const WrapperComponent = ({ children }) => (
+ {children}
+ );
+
+ const { container } = render(, {
+ wrapper: WrapperComponent,
+ });
+
+ expect(container).toBeDefined();
+ // `WrapperComponent` composite component is returned with no testID passed to
+ // it. This behavior will break if we start returning only host components.
+ expect(container.type).toBe(WrapperComponent);
+ expect(container.props.testID).not.toBeDefined();
+});
diff --git a/src/fireEvent.js b/src/fireEvent.js
index c9156dd13..f3846c714 100644
--- a/src/fireEvent.js
+++ b/src/fireEvent.js
@@ -7,7 +7,6 @@ const isHostElement = (element?: ReactTestInstance) => {
};
const isTextInput = (element?: ReactTestInstance) => {
- // eslint-disable-next-line import/no-extraneous-dependencies
const { TextInput } = require('react-native');
return element?.type === TextInput;
};
diff --git a/src/helpers/getByAPI.js b/src/helpers/getByAPI.js
index 6f860ac8c..33c88d50f 100644
--- a/src/helpers/getByAPI.js
+++ b/src/helpers/getByAPI.js
@@ -13,7 +13,6 @@ const filterNodeByType = (node, type) => node.type === type;
const getNodeByText = (node, text) => {
try {
- // eslint-disable-next-line
const { Text } = require('react-native');
const isTextComponent = filterNodeByType(node, Text);
if (isTextComponent) {
@@ -61,7 +60,6 @@ const getChildrenAsText = (children, TextComponent, textContent = []) => {
const getTextInputNodeByPlaceholderText = (node, placeholder) => {
try {
- // eslint-disable-next-line
const { TextInput } = require('react-native');
return (
filterNodeByType(node, TextInput) &&
@@ -76,7 +74,6 @@ const getTextInputNodeByPlaceholderText = (node, placeholder) => {
const getTextInputNodeByDisplayValue = (node, value) => {
try {
- // eslint-disable-next-line
const { TextInput } = require('react-native');
return (
filterNodeByType(node, TextInput) &&
diff --git a/src/render.js b/src/render.js
index 3adfcc8d7..03e745dcf 100644
--- a/src/render.js
+++ b/src/render.js
@@ -44,6 +44,7 @@ export default function render(
...findByAPI(instance),
...a11yAPI(instance),
update,
+ container: instance,
rerender: update, // alias for `update`
unmount: renderer.unmount,
toJSON: renderer.toJSON,
diff --git a/website/docs/API.md b/website/docs/API.md
index 0a323762e..abdef6031 100644
--- a/website/docs/API.md
+++ b/website/docs/API.md
@@ -118,6 +118,14 @@ toJSON(): ReactTestRendererJSON | null
Get the rendered component JSON representation, e.g. for snapshot testing.
+### `container`
+
+```ts
+container: ReactTestInstance;
+```
+
+A reference to the rendered root element.
+
## `cleanup`
```ts