In Vue 2.6.12
with Jest: "^27.5.1"
and "@vue/test-utils": "^1.3.0",
I am trying to mock out an async
method using jest. When I assert that my method has been called 1 time, it returns that it has not been called. Am I doing something blatantly wrong?
Update Email Test
import {mount} from '@vue/test-utils';
import UpdateEmail from './components/update-email.vue';
//validate form method testing
test('should submit form', async () => {
let wrapper = mount(UpdateEmail);
const mockedFormSubmit = jest.spyOn(UpdateEmail.methods, 'updateEmail');
// //Get our form fields
await wrapper.find('#email').setValue('[email protected]')
await wrapper.find('#password').setValue('MyPassword');
await wrapper.find('form').trigger('submit.prevent');
expect(mockedFormSubmit).toHaveBeenCalledTimes(1);
});
UpdateEmail Method
async updateEmail() {
this.validateFields();
try {
await axios.post(this.updateEmailPath, {
password: this.password,
email: this.email
});
} catch (e) {
console.log(e.message);
}
},
Output in console when test runs:
expect(jest.fn()).toHaveBeenCalledTimes(expected)
Expected number of calls: 1
Received number of calls: 0
35 | await wrapper.find('form').trigger('submit.prevent');
36 |
> 37 | expect(mockedFormSubmit).toHaveBeenCalledTimes(1);
| ^
38 | });
39 | });
CodePudding user response:
For Vue 2, the method must be mocked before mounting the component because the component's .methods
are wired up only upon mounting:
test('should submit form', async () => {
const mockedFormSubmit = jest.spyOn(UpdateEmail.methods, 'updateEmail'); ✅
let wrapper = mount(UpdateEmail);
// const mockedFormSubmit = jest.spyOn(UpdateEmail.methods, 'updateEmail'); ❌
⋮
});
In Vue 3, methods can be mocked post-mount directly off of the wrapper.vm
(starting with Vue 3.2.31).