Vue.js 开玩笑地模仿axios会返回未定义的axios

Vue.js 开玩笑地模仿axios会返回未定义的axios,vue.js,mocking,jestjs,axios,vue-test-utils,Vue.js,Mocking,Jestjs,Axios,Vue Test Utils,我也看到过类似的问题,但它们实际上并没有说明我在寻找什么 因此,我在app.js中全局使用axios作为我的vue应用程序的窗口。axios=require('axios')) 那么在auth.js中我有这个 export function login(credentials){ return new Promise((res,rej) => { axios.post('/api/auth/login', credentials) .then

我也看到过类似的问题,但它们实际上并没有说明我在寻找什么

因此,我在app.js中全局使用axios作为我的vue应用程序的窗口。axios=require('axios'))

那么在auth.js中我有这个

export function login(credentials){
    return new Promise((res,rej) => {
        axios.post('/api/auth/login', credentials)
            .then((response) => {
                res(response.data);
            })
            .catch((err) => {
                rej("Wrong email or password");
            })
    });
}
这在登录页面上运行良好

但是在我的测试脚本中

jest.mock("axios", () => ({
    post: jest.fn(() => Promise.resolve({data:{first_name:'James','last_name':'Nwachukwu','token':'abc123'}}))
}));


    import axios from 'axios'
    import {login} from '../helpers/auth'
    it("it logs in when data is passed", async () => {
        const email='super@gmail.com'
        const password='secret';
        const result=await login({email,password});
        expect(axios.post).toBeCalledWith('/api/auth/login',{"email": "super@gmail.com", "password": "secret"})
        expect(result).toEqual({first_name:'James','last_name':'Nwachukwu','token':'abc123'})
    })
显示未定义axios

但是如果我把auth.js改为

import axios from 'axios'
export function login(credentials){
    return new Promise((res,rej) => {
        axios.post('/api/auth/login', credentials)
            .then((response) => {
                res(response.data);
            })
            .catch((err) => {
                rej("Wrong email or password");
            })
    });
}

考试通过了。如何在不必在每个vue文件上导入axios的情况下运行测试?我刚才遇到了同样的问题。我还通过
window.axios=require('axios')包括axios在我的app.js中

解决方案是在测试中设置axios mock on
window.axios
。因此,与此相反(不正确):

axios={
post:jest.fn().mockName('axiosPost')
}
常量包装=装载(组件{
模拟:{
axios:axios
}
})
当您的组件代码调用
axios.whatever
时,它实际上是在调用
window.axios.whatever
(据我所知),因此您需要在测试环境中镜像它:

window.axios={
post:jest.fn().mockName('axiosPost')
}
常量包装=装载(组件{
模拟:{
axios:window.axios
}
})
在你的测试中:

expect(window.axios.post).toHaveBeenCalled()