Using react, jest, react-testing-library, emotion
Everytime I update a component the className in my snapshot tests updates because of how emotion/styled uses hash for classNames.
This keeps breaking my snapshot tests. Is it possible to make the classNames more static for testing?
I found this https://emotion.sh/docs/testing but it kinda does the opposite of what I want with adding the css to the snapshot tests..
Related
How to test react hooks..? Is there any way to test react functions inside the components?
I researched many. But I couldn't find how to test react state changes(useState) and functions inside the components. How to test them?
We have been using Enzyme for a long time to test our react components but have started the migration to React Testing Library step by step.
When trying to use the toHaveValue matcher in a RTL test it failes since the enzyme matcher with the same name is called instead. Is there a way I can "tell" a specific test file to use the matchers from jest-dom instead?
I have added both the enzyme and jest-dom matchers to my repository according to the installation docs.
The toHaveValue() assertion is provided by react-testing-library's jest-dom (https://github.com/testing-library/jest-dom#tohavevalue).
You should be able to force the jest-dom matchers (assertions) "before" whichever ones you have loaded previously (enzyme's, for example) by putting
import "#testing-library/jest-dom/extend-expect";
at the top of your test.
See also:
https://github.com/testing-library/react-testing-library/issues/379 and
https://github.com/facebook/jest/issues/6243
A similar issue:
https://github.com/testing-library/jest-dom/issues/208
I am using a coverage report generator to automatically check the lines of unit testing coverage in files in the Pull request checks, etc.
However using Jest and Enzyme, I am unable to cover the useEffect() code which is affecting the coverage % as shown below. How can I cover the lines in useEffect hook? Is this possible in Jest/Enzyme?
Try updating the value of filtersState.isDefaultAmrSet.
I was surprised that many blogs are writing unit tests for React Applications using both Jest and Enzyme.
Cant, we write unit tests for React applications by using the only jest or by the only Enzyme??
If yes, to get a component we use shallow() in enzyme but what we use in Jest?
I think you didn't fully understand the concepts of jest and enzyme.
Jest
TL;DR: Jest is just a test runner on steroids for JavaScript (not just react).
The main functionality of jest is to execute JavaScript tests. It gives you tools to organize your tests, e.g. using describe, it or test blocks. jest comes with a lot of build-in assertions (e.g. expect(actual).toBe(expected)) to help you identifying failing and succeeding tests. On top of that jest comes with additional features, for example it allows you to easily mock functions or even complete modules.
jest is not bound to react in general, but does quite well in combination with react, since it is maintained by facebook just as react itself. So it's basically almost everytime the right joice and also recommended by react.
Enzyme
TL;DR: Collection of utilities to simplify testing/rendering react components.
Technically you don't need Enzyme or any other framework to test react components (only jest). react already exposes react-dom/test-utils but it's really cumbersome to work with those without properly wrapping and simplyfing its API. And that's exactly what enzyme is doing. It basically puts a layer of abstraction over react-dom/test-utils and adds a bunch of utilities, so you don't need to worry about implementing them yourself.
I highly recommend you to look at react-testing-library, an alternative to enzyme, and read "Testing Implementation Details" blog post authored by its founder.
react-testing-library is, like jest, recommended by react.
Jest and Enzyme are not comparable.
Jest don't give you rich API/function to access dom elements like enzyme but it does other important tasks like when you hit command npm test or npm run test jest collect all the test file eg all files ending with .test.js run each test cases within these files and show the result in the console like below its jest responsibility.
Jest is a testing framework or test runner which runs all the test files in one go, enzyme is a utility or library consider this a smaller thing compare to jest it gives many functions to access dom easily like shallow, mount, find, children, etc...
/Users/***/Desktop/projects/***/node_modules/jest-runtime/build/index.js:517
const wrapper = this._environment.runScript(transformedFile.script)[
Sometimes if i'm run npm test jest given this error.
It can be caused by running an Animated animation in React Native. Not running that animation when jest is detected is the best solution I found for now. I tried not to run animation, and the error gone.
This happens to me when not shallow rendering a component in a test.
My guess is that it's caused by the rendering of the children components, so I mocked the parent component of the render function and the tests started running fine.
You have a great example of mocking children components here: https://jestjs.io/docs/en/es6-class-mocks