Vue.js 开玩笑地模仿axios会返回未定义的axios
我也看到过类似的问题,但它们实际上并没有说明我在寻找什么 因此,我在app.js中全局使用axios作为我的vue应用程序的窗口。axios=require('axios')) 那么在auth.js中我有这个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
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 onwindow.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()