pinia
pinia copied to clipboard
Pinia Nuxt module breaks the `createTestingPinia` helper in tests
Reproduction
https://github.com/antoinezanardi/nuxt-pinia-testing
Steps to reproduce the bug
- Clone the reproduction repository.
- Run
pnpm install
- Run
vitest --config vitest.unit-config.ts
Expected behavior
The test should pass as the method from store is called when the component is mounted.
Actual behavior
When using the createTestingPinia
util method in a Nuxt project, the stores are not correctly mocked.
I created a simple test which expect a method from a store to be called when the component is mounted.
However, the test fails with the following logs :
fetchAndSetRoles # <- This is the log from the store method, proving it's called and not correctly mocked.
stderr | tests/unit/app.nuxt.spec.ts > App Component > Store > should call method from store when mounted.
[Vue warn]: App already provides property with key "Symbol(pinia)". It will be overwritten with the new value. # <- This warning is not expected.
FAIL tests/unit/app.nuxt.spec.ts > App Component > Store > should call method from store when mounted.
TypeError: [Function] is not a spy or a call to a spy! # <- Store is not mocked
Additional information
I'm pretty sure that the nuxt module is the source of the problem.
If you comment the module in the nuxt.config.ts
at the root of the project, the test passes.
// nuxt.config.ts
export default defineNuxtConfig({
modules: [
//"@pinia/nuxt", <- If you comment this line, the test passes …!
],
devtools: { enabled: true }
})
Maybe the source code is using a different version of Pinia or is not setting the NODE_ENV
to test. Contribution Welcome!
While waiting for this bug to be fixed, here is my quick dirty fix solution :
// nuxt.config.ts
const modules = [
process.env.NODE_ENV !== "test" && "@pinia/nuxt",
];
export default defineNuxtConfig({
app: { head: { link: [{ rel: "icon", type: "image/png", href: "/favicon.png" }] } },
modules,
devtools: { enabled: true },
typescript: {
strict: true,
typeCheck: true,
},
});
As you can see, I add the pinia nuxt module in my nuxt.config.ts
file if I'm not in a TEST
environnement. You must add the NODE_ENV="test"
env var yourself before launching your tests.
This way, you can enjoy the pinia nuxt module when running your app and disable it when you want to mock them in your unit tests.
FYI, the NODE_ENV=test
should be set by the tool launching the tests. If it isn't, the bug should be reported there
The NODE_ENV=test
is set by myself for my personal needs. It is not related to this issue.
When checking the env, I can assure you that the NODE_ENV=test
is set by nuxt when running unit tests. So the bug is not from there.
I see, I misread that. For anybody, feel free to try to fix this and submit a PR 👍
I see, I misread that. For anybody, feel free to try to fix this and submit a PR 👍明白了,我看错了。对于任何人,请随时尝试解决此问题并提交 PR 👍
I took a look, and the issue appears to be in the createTestingPinia
function. @nuxt/pinia
maybe no issue.
issue was fixed downstream in @vue/test-utils
, simply upgrade to 2.4.6
to fix the issue