How can I spy on a function from setup in vuejs3?
Answer a question I have a function in my component inside of setup(): export default defineComponent({ setup() { const handleResume = async () => { msg.value = {} try { } catch (err) { } } return { h
Answer a question
I have a function in my component inside of setup()
:
export default defineComponent({
setup() {
const handleResume = async () => {
msg.value = {}
try {
} catch (err) {
}
}
return { handleResume }
}
})
Now in my test, I want to create a spy function like this:
import App from '@/views/Frame'
jest.spyOn(App, 'handleResume')
But I am getting this error:
Cannot spy the handleResume property because it is not a function; undefined given instead
Answers
This requires Vue 3.2.31 (released yesterday), which adds support for mocking Proxy
methods, enabling spies on the wrapper.vm
from @vue/test-utils
.
You can expose methods (or other data) from setup()
with the expose
property from the context
argument. For example, this component exposes handleResume
only in tests:
<!-- MyComponent.vue -->
<script>
import { defineComponent } from 'vue'
export default defineComponent({
👇
setup(props, { expose }) {
const handleResume = async () => true
if (process.env.NODE_ENV === 'test') {
👇
expose({ handleResume })
}
return { handleResume }
}
})
</script>
<template>
<button @click="handleResume">Click</button>
</template>
If you have <script setup>
instead, use the defineExpose()
macro:
<!-- MyComponent.vue -->
<script setup>
const handleResume = async () => true
if (process.env.NODE_ENV === 'test') {
👇
defineExpose({ handleResume })
}
</script>
Then spy on the exposed handleResume
from the wrapper.vm
:
// MyComponent.spec.js
import { shallowMount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
describe('MyComponent', () => {
it('handles resume', async () => {
const wrapper = shallowMount(MyComponent)
👇
const handleResume = jest.spyOn(wrapper.vm, 'handleResume')
await wrapper.find('button').trigger('click')
expect(handleResume).toHaveBeenCalled()
})
})
demo
更多推荐
所有评论(0)