Saya mempunyai komponen dan kedai Pinia yang mengandungi keadaan dan beberapa operasi. Kod ini berfungsi dengan baik dalam pelayar dan ujian E2E (cypress), tetapi gagal dalam ujian unit. Saya menggunakan vue-testing-utils dan vitest.
Memanggil fungsi tersimpan daripada ujian unit berfungsi dengan baik apabila butang diklik, tetapi jika fungsi itu dipasang atau skrip utama, ujian gagal
src/components/UsersComponent.vue
<script setup> import { onMounted } from 'vue' import { useUsersStore } from '@/stores/users.store' const usersStore = useUsersStore() // usersStore.resetStatus() // <- This fails in the unit test onMounted(() => { usersStore.resetStatus() // <- This fails in the unit test }) function changeStatus() { usersStore.changeStatus() // <- This passes in the unit test } </script> <template> <div> <p>Status: {{ usersStore.status }}</p> <button @click="changeStatus()">Change Status</button> </div> </template>
src/stores/users.store.js
import { defineStore } from 'pinia' import { usersAPI } from '@/gateways' export const useUsersStore = defineStore({ id: 'users', persist: true, state: () => ({ status: 'ready', }), getters: {}, actions: { resetStatus() { this.status = 'ready' }, changeStatus() { this.status = 'loading' }, }, })
src/components/test/UsersComponent.spec.js
import { describe, it, expect, vi, beforeEach } from 'vitest' import { mount } from '@vue/test-utils' import { createTestingPinia } from '@pinia/testing' import UsersComponent from '@/components/UsersComponent.vue' import { useUsersStore } from '@/stores/users.store' const wrapper = mount(UsersComponent, { global: { plugins: [createTestingPinia({ createSpy: vi.fn() })], }, }) const usersStore = useUsersStore() describe('UsersComponent', () => { it('store function is called', async () => { // arrange const spy = vi.spyOn(usersStore, 'resetStatus') const button = wrapper.find('button') // act await button.trigger('click') // assert expect(spy).toHaveBeenCalled() }) })
Ujian unit mengembalikan 2 ralat berbeza. Yang pertama ialah log konsol apabila fungsi cuba dijalankan dalam onMounted()
dan yang kedua ialah apa yang dikembalikan oleh vitest.
stderr | unknown test [Vue warn]: Unhandled error during execution of mounted hook at <UsersComponent ref="VTU_COMPONENT" > at <VTUROOT>
FAIL src/components/__tests__/UsersComponent.spec.js [ src/components/__tests__/UsersComponent.spec.js ] TypeError: usersStore.resetStatus is not a function ❯ src/components/UsersComponent.vue:16:14 16| 17| <template> 18| <div> | ^ 19| <p>Status: {{ usersStore.status }}</p> 20| <button @click="changeStatus()">Change Status</button>
Saya tahu contoh ini agak asas dan tidak benar-benar memenuhi tujuan, tetapi saya ingin tahu cara menyimpan fungsi dalam onMounted()
(atau tempat yang serupa) tanpa melanggar semua ujian unit saya.
Mungkin ini berguna kepada anda: