-
Notifications
You must be signed in to change notification settings - Fork 48.4k
Proposals for the ReactTestRenderer API #7148
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Comments
As a temporary workaround, alternating between |
Going to use this issue to track other bugs/improvements: @cpojer said that when replacing the Image.js mock in facebook/react-native@7c53add with
Pretty sure that should work (and if not, give a better error message). |
No luck, got this error instead: |
It would be nice to be able to traverse the tree.
|
Adds `.update(newElement)` and `.unmount()` and makes children reorders and composite type swapping work. Part of facebook#7148.
Adds `.update(newElement)` and `.unmount()` and makes children reorders and composite type swapping work. Part of #7148.
Currently trying to use this with jest snapshot testing but if a component contains a ref or makes a call to Componentimport React from 'react';
export default class Link extends React.Component {
render() {
return (
<a
ref={a => this._a = a}
href={this.props.page || '#'}>
{this.props.children}
</a>
);
}
} Test'use strict'
import React from 'react';
import Link from '../Link';
import renderer from 'react/lib/ReactTestRenderer';
describe('Link', () => {
it('renders correctly', () => {
const tree = renderer.create(
<Link page="foo" />
).toJSON();
expect(tree).toMatchSnapshot();
});
}); stack trace FAIL __tests__/Link-test.js (2.148s)
● Link › it renders correctly
- TypeError: component.getPublicInstance is not a function
at attachRef (node_modules/react/lib/ReactRef.js:20:19)
at Object.ReactRef.attachRefs (node_modules/react/lib/ReactRef.js:42:5)
at attachRefs (node_modules/react/lib/ReactReconciler.js:26:12)
at CallbackQueue._assign.notifyAll (node_modules/react/lib/CallbackQueue.js:67:22)
at ReactTestReconcileTransaction.ON_DOM_READY_QUEUEING.close (node_modules/react/lib/ReactTestReconcileTransaction.js:37:26)
at ReactTestReconcileTransaction.Mixin.closeAll (node_modules/react/lib/Transaction.js:204:25)
at ReactTestReconcileTransaction.Mixin.perform (node_modules/react/lib/Transaction.js:151:16)
at batchedMountComponentIntoNode (node_modules/react/lib/ReactTestMount.js:61:27)
at ReactDefaultBatchingStrategyTransaction.Mixin.perform (node_modules/react/lib/Transaction.js:138:20)
at Object.ReactDefaultBatchingStrategy.batchedUpdates (node_modules/react/lib/ReactDefaultBatchingStrategy.js:63:19) |
@ryanseddon Can you file a new issue for your specific problem, this issue is about tracking other APIs. |
apologies, done #7371 |
Did you guys think about enabling shallow rendering support in the test renderer? See jestjs/jest#1683 |
Maybe you can just make the pretty-printer understand the output of render (that is, a React element). I don't know what else we might add that would be helpful. |
Ah, that's an interesting idea. We could allow people to specify how deep react components should render? Would you prefer that over a shallow render API for the test renderer? |
I don't think I understand what you want. The test renderer does deep renders and gives you a JSON blob you can inspect. The shallow renderer API does shallow renders and gives you a React element tree that you can inspect. Do you want something different? |
My understanding is that shallow rendering only renders one level deep and it is a separate renderer as well. I was wondering if we could use the test renderer to do the same or to add an API that only returns the shallow rendered tree (only 1 level deep), if that makes sense. I'm sorry if I'm missing something here. |
What would be the advantage over the existing shallow renderer? |
I'm not sure I'm up to date on how it works. Which render target does it use? Can I use the shallow renderer with react-test-renderer? |
Here is the usage example in the docs: https://facebook.github.io/react/docs/test-utils.html#shallow-rendering From the technical implementation I don't think I would describe it exactly as a separate renderer, but it doesn't rely on either react-dom or react-test-renderer. You should be able to use it at the same time as either. |
Since we already have a pretty printer for react elements for the diff engine it seems like snapshotting a shallow render output should just work then, right? |
The return value is in a slightly different format (React elements instead of JSON), which is what I meant above by adding support for pretty-printing React elements. |
Got it, yeah we already do that in pretty-format. @gaearon snuck it in. |
Hi, I'm trying to use snapshot + shallow:
It works pretty cool :D |
@cpojer I think the ability to specify an integer to determine render depth makes a whole lot of sense. Currently if you're using just jest you're left doing a lot of work mocking components to achieve the shallow render you get for free with However having to make the tradeoff could be avoided with:
I think it's a nice fit for jest. With something as powerful as Jest, using |
We have traversal now. |
Do you want to request a feature or report a bug?
New feature
What is the current behavior?
ReactTestRenderer
returns an "instance", but this primarily seems to support two things: getting a representation of the "rendered" output and calling methods on the instance (viainstance.getInstance().componentMethod()
).What is the expected behavior?
This is good for testing regular UI components, but testing infra-level components (HOCs) often requires testing lifecycle hooks. I've found that I need the ability to re-render the component with new props (test
componentWillReceiveProps
,shouldComponentUpdate
, etc) and unmount the component altogether (testcomponentWillUnmount
).Changing props can be accomplished via a helper (I'm using the following to work around this issue):
This works for updating props, but calling
PropsSetter#unmount()
fails withReactComponentEnvironment.replaceNodeWithMarkup is not a function
(appears that replacing the component with the dummy<div />
is failing).Preferably the API would support both of these directly:
Which versions of React, and which browser / OS are affected by this issue? Did this work in previous versions of React?
This is a new API only on master (to my knowledge).
The text was updated successfully, but these errors were encountered: