首页 > 解决方案 > Jest / Vue Test Utils - Axios mock 仅适用于测试文件本身

问题描述

我正在尝试创建我的第一个 Vue.js 2.x 测试,我可以使用一些帮助:

出于某种原因,模拟仅适用于 .spec 文件中定义的函数,而不适用于导入的函数。

例如,以下代码有效:

// login.spec.js file - note "login" is defined here (which uses "axios" mock)

function login(email, password) {
    // I'm defined inside the spec file!
    let payload = { email, password };
    return axios.post(loginApiUrl, payload);
}

jest.mock('axios');

beforeEach(() => {
    jest.clearAllMocks()
})
describe('Login.vue', () => {
    it('sample test', async () => {
        const data = { a: 1 };
        axios.post.mockResolvedValueOnce(data);
        let res = await login('abcd@example.com', 'password')
        expect(axios.post).toHaveBeenCalledTimes(1)
        // The mock works!

虽然这不是:

// login.spec.js file
import auth from '@/api/auth.js'
jest.mock('axios');

beforeEach(() => {
    jest.clearAllMocks()
})
describe('Login.vue', () => {
    it('sample test', async () => {
        const data = { a: 1 };
        axios.post.mockResolvedValueOnce(data);
        let res = await auth.login('abcd@example.com', 'password')
        expect(axios.post).toHaveBeenCalledTimes(1)
        // This doesn't work (fetching the original URL)



// auth.js

import axios from 'axios'
import { loginApiUrl } from '../helpers/constants'

const auth = {
    login(email, password) {
        // params are string payloads login request
        // return: axios Promise
        let payload = { email, password };
        console.log('login')
        return axios.post(loginApiUrl, payload);
    }
}
export default auth;

请注意,第二个代码调用了实际的 URL(没有模拟)

有人有想法吗?

提前致谢。

标签: vue.jsjestjsmockingvue-test-utils

解决方案


推荐阅读