Getting ReferenceError: React is not defined with Vitest + Solid Testing Library
I honestly have no idea how I am receiving this error but I am despite testing using
@solidjs/testing-library
. Moreover, I am using Vitest
by itself (not Vite
) and my vitest.config.ts
is as follows:
The test that is causing the error to appear is a custom Solid hook test where I am attempting to pass a wrapper
to my renderHook
invocation.
Anybody seen that before?16 Replies
You missed plugins: [solid()] that needs to be imported from vite-plugin-solid.
And you can lose the deps, our plugin already does the required configuration.
@Alex Lohr is there any way to get it working with just Vitest? Or do I have to use Vitest through a Vite config?
you can use vite plugins in “just vitest”
isn’t vite its dependency?
I’ve just installed Vitest and created a
vitest.config.ts
and everything worked until I tried to create a wrapper component
In my case I’m just building a custom SolidJS hooks librarywell you need solid’s jsx compiler if you want to use jsx with solid
regardless of of its vite, vitest, jest, or whatever
but also if it’s a library that has nothing to do with rendering, then there is no point in adding rendering to unit tests
you can test most functionality with just
createRoot
, that’s what we usually do in solid-primitives
we use vitest as wellif you have a vitest.config.js, you need to copy the parts of vite.config.js that let solid do its precompilation and avoid requiring React for JSX over. That is, if you don't have solid-start, this should work, otherwise, you still need the vitest.config.ts.
@Alex Lohr what parts are those exactly?
Basically, the vite-plugin-solid, like I said. I'm currently trying to fix testing in solid-start, too.
Ah, interesting, let me try that then. So I just wrap my hooks with a
createRoot
call in test?Exactly.
Excellent — let me see if I can get away with just doing that then
@Alex Lohr holy crapola! Wrapping with
createRoot
in test worked! So wait, is it safe to say there's no need to use renderHook
from @solidjs/testing-library
for hook libraries?renderHook is only there if you want to test your hooks in a JSX context (e.g. to wrap it in a provider).
otherwise, createRoot suffices.
If you are not using that, you can forgo testing-library, because that's only used to test stuff from a user's perspective within an rendered page (or an approximate representation of one).
So incredible — this just removed a heavy blocker I was dealing with in test. Thank you so much!!
I should probably add a few lines to the README of our testing library.
To unblock other people with the same issues.
@Alex Lohr I think that’s a great idea.
I think emphasizing that point of being able to rely on
createRoot
and linking to examples demonstrating that technique would be perfect. In my head, I had the impression that I needed to use the Solid Testing Library for anything and everything related to SolidI feel the testing-library is the focus point for all testing-related issues that are usually rather related to the vite plugin or wrong configuration.
By the way, we do have
testEffect
in our testing library, this sets up createRoot in a Promise to be returned for the test and also to capture errors correctly. It doesn't use the React stuff, so it should work fine.
OK, added a few lines.