Have you ever spent hours thinking how could you test a method called on mount?
First lets say we have this component:
export default { name: 'MyCustomComponent', mounted() { this.calledOnMount() }, methods: { calledOnMount() {} } }
We want to make sure the calledOnMount
will be called, using @vue/test-utils and vitest/jest there are two main ways to test validate it:
toHaveBeenCalled
toBeCalled
But the work with a spy function and usually we write tests like this:
import { mount } from '@vue/test-utils' import MyCustomComponent from '../MyCustomComponent.vue' describe('MyCustomComponent.vue', () => { const wrapper = mount(MyCustomComponent) spyOn(wrapper.vm, 'calledOnMount') })
When calling the mount
it already runs the mounted
lifecicly, so, even adding a spy it will always fail.
-
toHaveBeenCalled
-> we can't intercept the mount proccess to add a spy on here -
toBeCalled
-> the function has already be called
But calm down, there is a way to test it, for sure!
We had to bind the spy by accessing the .vue
component and its options.methods
such:
import MyCustomComponent from '../MyCustomComponent.vue' type MyCustomComponentType = { options: { methods: { calledOnMount: () => void } } } vi.spyOn( (MyCustomComponent as unknown as MyCustomComponentType).options.methods, 'calledOnMount' )
This way you dont have to intercept the wrapper functions, but the component signature function.
Once the mounted component is like a new "instance" of a "class" component, the spy we add on the .vue, will also works with the mounted component on test.
describe('MyCustomComponent.vue', () => { const wrapper = mount() it('Should remove scroll event listener on destroy', async () => { expect( (MyCustomComponent as unknown as MyCustomComponentType).options.methods .calledOnMount ).toHaveBeenCalled() }) })
Now you can easy test your functions and everything you do on mount.
Top comments (0)