-
-
Notifications
You must be signed in to change notification settings - Fork 127
deps: migrate from Enzyme to RTL #88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- Enzyme only has unofficial support for React 17 and no support what-so-ever for React 18, so forced to migrate
- RTL is most certainly more of an integration testing library than a unit test library
- can't access the instance through RTL, even though this component actually _needs_ to use refs (bc canvas)
- I managed to hack around this by using refs, but I honestly wasn't even sure that this was possible
- notably hooks like `useRef` don't work since they can only be used inside of a React component or another hook
- but callback refs and `createRef` do work fortunately
- tried to use `react-dom-instance` initially, as suggested in blog post by the author, but it only works with React 16
- in React 17 and React 18 it just returns `false` and doesn't get an instance
- `querySelector` is an escape hatch that is not recommended, enough so that I read through the docs multiple times before finding it was even possible
- was using `document.querySelector` directly before finding this
- somewhat replaces Enzyme's `exists`
- `rerender` is also a bit of an escape hatch
- notably, you can't set props directly on a `ref`, `.props` is a read-only property, so had to find some alternative to be able to run the tests
- replaces Enzyme's `setProps`
- had to change `clearOnResize` to an optional type as it was required without this
- despite that it's in `defaultProps`; the interface itself can't infer this, so probably makes sense to make it optional here as well
Codecov Report
@@ Coverage Diff @@
## main #88 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 1 1
Lines 75 75
Branches 9 9
=========================================
Hits 75 75
Continue to review full report at Codecov.
|
agilgur5
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Was a non-trivial refactor with lots of different issues, but the end code diff I achieved is actually relatively small! LGTM
* deps: migrate from Enzyme to RTL
- Enzyme only has unofficial support for React 17 and no support what-so-ever for React 18, so forced to migrate
- RTL is most certainly more of an integration testing library than a unit test library
- can't access the instance through RTL, even though this component actually _needs_ to use refs (bc canvas)
- I managed to hack around this by using refs, but I honestly wasn't even sure that this was possible
- notably hooks like `useRef` don't work since they can only be used inside of a React component or another hook
- but callback refs and `createRef` do work fortunately
- tried to use `react-dom-instance` initially, as suggested in blog post by the author, but it only works with React 16
- in React 17 and React 18 it just returns `false` and doesn't get an instance
- `querySelector` is an escape hatch that is not recommended, enough so that I read through the docs multiple times before finding it was even possible
- was using `document.querySelector` directly before finding this
- somewhat replaces Enzyme's `exists`
- `rerender` is also a bit of an escape hatch
- notably, you can't set props directly on a `ref`, `.props` is a read-only property, so had to find some alternative to be able to run the tests
- replaces Enzyme's `setProps`
- had to change `clearOnResize` to an optional type as it was required without this
- despite that it's in `defaultProps`; the interface itself can't infer this, so probably makes sense to make it optional here as well
* fix lint issues
* deps: migrate from Enzyme to RTL
- Enzyme only has unofficial support for React 17 and no support what-so-ever for React 18, so forced to migrate
- RTL is most certainly more of an integration testing library than a unit test library
- can't access the instance through RTL, even though this component actually _needs_ to use refs (bc canvas)
- I managed to hack around this by using refs, but I honestly wasn't even sure that this was possible
- notably hooks like `useRef` don't work since they can only be used inside of a React component or another hook
- but callback refs and `createRef` do work fortunately
- tried to use `react-dom-instance` initially, as suggested in blog post by the author, but it only works with React 16
- in React 17 and React 18 it just returns `false` and doesn't get an instance
- `querySelector` is an escape hatch that is not recommended, enough so that I read through the docs multiple times before finding it was even possible
- was using `document.querySelector` directly before finding this
- somewhat replaces Enzyme's `exists`
- `rerender` is also a bit of an escape hatch
- notably, you can't set props directly on a `ref`, `.props` is a read-only property, so had to find some alternative to be able to run the tests
- replaces Enzyme's `setProps`
- had to change `clearOnResize` to an optional type as it was required without this
- despite that it's in `defaultProps`; the interface itself can't infer this, so probably makes sense to make it optional here as well
* fix lint issues
Summary
Migrate testing framework from Enzyme to React Testing Library (RTL).
This paves the way for support for React 18 (#76), as it was not possible to test with Enzyme due to the lack of React 18 adapter.
Details
Enzyme only has unofficial, partial support for React 17 (Support for React 17 enzymejs/enzyme#2429) and no support what-so-ever for React 18 (Support for React 18 enzymejs/enzyme#2524), so forced to migrate (see also add React 17 to peerDep range -- needs to update devDeps and tests #64 (review) and React 18 support in peerDeps #76 (comment))
RTL is most certainly more of an integration testing library than a unit test library
useRefdon't work since they can only be used inside of a React component or another hookcreateRefdo work fortunatelyreact-dom-instanceinitially, as suggested in a blog post by the author, but it only works with React 16 (see the issue I filed w/ repro: Doesn't work with React 17 or React 18 arqex/react-dom-instance#14)falseand doesn't get an instancequerySelectoris an escape hatch that is not recommended, enough so that I read through the docs multiple times before finding it was even possibledocument.querySelectordirectly before finding thisexistsrerenderis also a bit of an escape hatchref,.propsis a read-only property, so had to find some alternative to be able to run the testssetPropshad to change
clearOnResizeto an optional type as it was required without thisdefaultProps; the interface itself can't infer this, so probably makes sense to make it optional here as wellNext Steps
I tested this with React 18 as well and everything worked, so next PRs will add support for React 18 in peerDeps (#76)