test: add vitest config and unit tests
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
||||
|
||||
const { mockGet, mockPost, mockPut, mockDel } = vi.hoisted(() => ({
|
||||
mockGet: vi.fn(),
|
||||
mockPost: vi.fn(),
|
||||
mockPut: vi.fn(),
|
||||
mockDel: vi.fn(),
|
||||
}))
|
||||
|
||||
vi.mock('axios', () => ({
|
||||
default: {
|
||||
create: vi.fn(() => ({
|
||||
get: mockGet,
|
||||
post: mockPost,
|
||||
put: mockPut,
|
||||
delete: mockDel,
|
||||
interceptors: {
|
||||
request: { use: vi.fn() },
|
||||
response: { use: vi.fn() },
|
||||
},
|
||||
})),
|
||||
},
|
||||
}))
|
||||
|
||||
vi.mock('element-plus', () => ({
|
||||
ElMessage: {
|
||||
success: vi.fn(),
|
||||
error: vi.fn(),
|
||||
warning: vi.fn(),
|
||||
info: vi.fn(),
|
||||
},
|
||||
}))
|
||||
|
||||
import request from '@/utils/request'
|
||||
|
||||
describe('request utility', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
})
|
||||
|
||||
describe('get', () => {
|
||||
it('should call axios.get with url and params wrapped', async () => {
|
||||
mockGet.mockResolvedValue({ data: { code: 200, data: 'test' } })
|
||||
const result = await request.get('/test', { id: 1 })
|
||||
expect(mockGet).toHaveBeenCalledWith('/test', { params: { id: 1 } })
|
||||
expect(result).toEqual({ code: 200, data: 'test' })
|
||||
})
|
||||
|
||||
it('should default to empty params object', async () => {
|
||||
mockGet.mockResolvedValue({ data: { code: 200, data: 'test' } })
|
||||
await request.get('/test')
|
||||
expect(mockGet).toHaveBeenCalledWith('/test', { params: {} })
|
||||
})
|
||||
|
||||
it('should reject when response code is not 200', async () => {
|
||||
mockGet.mockResolvedValue({ data: { code: 400, message: 'Bad request' } })
|
||||
await expect(request.get('/test')).rejects.toEqual({ code: 400, message: 'Bad request' })
|
||||
})
|
||||
})
|
||||
|
||||
describe('post', () => {
|
||||
it('should call axios.post with url, data, and empty config', async () => {
|
||||
mockPost.mockResolvedValue({ data: { code: 200, data: 'created' } })
|
||||
const result = await request.post('/test', { name: 'foo' })
|
||||
expect(mockPost).toHaveBeenCalledWith('/test', { name: 'foo' }, {})
|
||||
expect(result).toEqual({ code: 200, data: 'created' })
|
||||
})
|
||||
|
||||
it('should pass config when provided', async () => {
|
||||
mockPost.mockResolvedValue({ data: { code: 200, data: 'ok' } })
|
||||
await request.post('/test', null, { params: { id: 1 } })
|
||||
expect(mockPost).toHaveBeenCalledWith('/test', null, { params: { id: 1 } })
|
||||
})
|
||||
|
||||
it('should reject when response code is not 200', async () => {
|
||||
mockPost.mockResolvedValue({ data: { code: 500, message: 'Server error' } })
|
||||
await expect(request.post('/test')).rejects.toEqual({ code: 500, message: 'Server error' })
|
||||
})
|
||||
})
|
||||
|
||||
describe('put', () => {
|
||||
it('should call axios.put with url, data, and empty config', async () => {
|
||||
mockPut.mockResolvedValue({ data: { code: 200, data: 'updated' } })
|
||||
const result = await request.put('/test/1', { name: 'bar' })
|
||||
expect(mockPut).toHaveBeenCalledWith('/test/1', { name: 'bar' }, {})
|
||||
expect(result).toEqual({ code: 200, data: 'updated' })
|
||||
})
|
||||
})
|
||||
|
||||
describe('del', () => {
|
||||
it('should call axios.delete with url and params wrapped', async () => {
|
||||
mockDel.mockResolvedValue({ data: { code: 200, data: 'deleted' } })
|
||||
const result = await request.del('/test/1')
|
||||
expect(mockDel).toHaveBeenCalledWith('/test/1', { params: {} })
|
||||
expect(result).toEqual({ code: 200, data: 'deleted' })
|
||||
})
|
||||
|
||||
it('should merge params into config spread for axios.delete', async () => {
|
||||
mockDel.mockResolvedValue({ data: { code: 200, data: 'ok' } })
|
||||
// del(url, params={reason:'test'}, config={timeout:1000})
|
||||
// => axios.delete(url, { params: { reason:'test' }, timeout: 1000 })
|
||||
await request.del('/test/1', { reason: 'test' }, { timeout: 1000 })
|
||||
expect(mockDel).toHaveBeenCalledWith('/test/1', { params: { reason: 'test' }, timeout: 1000 })
|
||||
})
|
||||
})
|
||||
|
||||
describe('generic request', () => {
|
||||
it('should dispatch GET with params', async () => {
|
||||
mockGet.mockResolvedValue({ data: { code: 200, data: 'ok' } })
|
||||
const result = await request.request('get', '/test', { id: 1 })
|
||||
expect(mockGet).toHaveBeenCalledWith('/test', { params: { id: 1 } })
|
||||
expect(result).toEqual({ code: 200, data: 'ok' })
|
||||
})
|
||||
|
||||
it('should dispatch POST with data', async () => {
|
||||
mockPost.mockResolvedValue({ data: { code: 200, data: 'ok' } })
|
||||
await request.request('post', '/test', { name: 'foo' })
|
||||
expect(mockPost).toHaveBeenCalledWith('/test', { name: 'foo' }, {})
|
||||
})
|
||||
|
||||
it('should dispatch DELETE with params', async () => {
|
||||
mockDel.mockResolvedValue({ data: { code: 200, data: 'ok' } })
|
||||
await request.request('delete', '/test/1', null)
|
||||
expect(mockDel).toHaveBeenCalledWith('/test/1', { params: null })
|
||||
})
|
||||
|
||||
it('should throw for unsupported method', () => {
|
||||
expect(() => request.request('patch', '/test', null)).toThrow('请求方法 patch 未实现')
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user