如何用jest测试Vue 3和惯性

How to test Vue3 and intertia with jest

在使用 Laravel Mix 设置的 Laravel + Vue3 + Inertia 项目中,我们如何创建 前端 测试?

特别是,我不知道如何处理InertiaShare DatausePage()useForm方法?

我遇到的第一个错误是:

    TypeError: Cannot read properties of undefined (reading 'someSharedData')                                                                                          
                                                                                                                                                              
      2 |                                                                                                                                                     
      3 | export const handleSometing = (something) =>                                                                                                        
    > 4 |   usePage().props.value.someSharedData                                                                                                
        |   ^                                                                                                                                                 
      5 |     ...                                                                                                              
      6 |   )

在谷歌上搜索了一些无用的时间并没有找到任何关于这个确切问题的信息后,我找到了这个解决方案。

密钥在 Jest Partial Mocking!
您可以模拟 useFormusePage,然后使用 Jest Partial Mocking.
模拟 Shared Data 设置 vue-test-util 后,我创建了这个测试文件,它运行得非常棒。

在下面的示例中,i18n 是使用 vue-test-utilsconfig 对象模拟的。 Inertia 的方法被 jest.mock() 模仿。

import { config, shallowMount } from '@vue/test-utils'
import Dashboard from '@/Components/ExampleComponent'

config.global.mocks = {
  $t: () => '',
}

jest.mock('@inertiajs/inertia-vue3', () => ({
  __esModule: true,
  ...jest.requireActual('@inertiajs/inertia-vue3'), // Keep the rest of Inertia untouched!
  useForm: () => ({
    /** Return what you need **/
    /** Don't forget to mock post, put, ... methods **/
  }),
  usePage: () => ({
    props: {
      value: {
        someSharedData: 'something',
      },
    },
  }),
}))

test('Render ExampleComponent without crash', () => {
  const wrapper = shallowMount(ExampleComponent, {
    props: {
      otherPageProps: {}
    }
  })

  expect(wrapper.text()).toContain('Hi! I am ExampleComponent.')
})