From 7a7fd00acbae348c613a490d5481977b6facfa29 Mon Sep 17 00:00:00 2001 From: dyh_a Date: Sun, 1 May 2022 13:21:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20methodFactory=E7=AC=AC=E4=BA=8C?= =?UTF-8?q?=E4=B8=AA=E5=8F=82=E6=95=B0=E6=8E=A5=E6=94=B6=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=94=B9=E9=85=8D=E7=BD=AE=EF=BC=9B=E6=96=B0?= =?UTF-8?q?=E5=A2=9Euse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __test__/AxiosRequestTemplate.test.ts | 7 ++- __test__/use.test.ts | 67 +++++++++++++++++++++++++++ src/AxiosRequestTemplate.ts | 20 ++++++-- 3 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 __test__/use.test.ts diff --git a/__test__/AxiosRequestTemplate.test.ts b/__test__/AxiosRequestTemplate.test.ts index 33c5498..85866ac 100644 --- a/__test__/AxiosRequestTemplate.test.ts +++ b/__test__/AxiosRequestTemplate.test.ts @@ -154,13 +154,12 @@ describe('AxiosRequestTemplate', () => { // 不传method时默认为get const defGet = req.methodFactory(undefined as any); const res1 = await defGet<{ username: string; id: number }>( - { url: '/user' }, + // 改为post,无效; + // methodFactory的method优先级更高,除了method,url,data其他的axios配置优先级都是这里的高 + { url: '/user', method: 'post' } as any, // method已经从methodFactory剔除出去,不设置为any将会报错 { statusHandlers: { '200': (_, res) => res }, }, - // 改为post,无效; - // methodFactory的method优先级更高,除了method,url,data其他的axios配置优先级都是这里的高 - // { method: 'post' } as any, ); expect(res1).toEqual({ data: { code: 200, data: { username: 'get', id: 1 }, msg: 'success' }, diff --git a/__test__/use.test.ts b/__test__/use.test.ts new file mode 100644 index 0000000..7dc8db9 --- /dev/null +++ b/__test__/use.test.ts @@ -0,0 +1,67 @@ +import axios, { AxiosRequestConfig } from 'axios'; +import { AxiosRequestTemplate } from '../src'; +import { mockAxiosResponse } from './utils'; + +jest.mock('axios'); +const map = new Map(); +const mockCreate = (/*config: AxiosRequestConfig*/) => { + // console.log(config); + return function (config) { + const { url, cancelToken } = config; + return new Promise((res, rej) => { + map.set(cancelToken, rej); + if (/^\/use/.test(url)) { + setTimeout(() => + res(mockAxiosResponse(config, { code: 200, data: config, msg: 'success' })), + ); + return; + } + }); + }; +}; +(axios.CancelToken.source as any).mockImplementation(() => { + const token = Math.floor(Math.random() * 0xffffffffff).toString(16); + return { + token, + cancel(msg?: string) { + map.get(token)?.(msg); + }, + }; +}); + +(axios as any).create.mockImplementation(mockCreate); +describe('use', () => { + const req = new AxiosRequestTemplate(); + test('empty', async () => { + const request = req.use({}); + const res = await request({ url: '/use' }); + expect(res.data.url).toBe('/use'); + expect(res.data.method).toBe('get'); + }); + test('url', async () => { + const post = req.use({ requestConfig: { url: '/use/', method: 'post' } }); + const res = await post({ url: 'test' }); + expect(res.data.url).toBe('/use/test'); + expect(res.data.method).toBe('post'); + const res2 = await post({ url: 'test2' }); + expect(res2.data.url).toBe('/use/test2'); + expect(res2.data.method).toBe('post'); + }); + test('methodFactory url', async () => { + const post = req.methodFactory('post', (configs) => { + configs.requestConfig.url = '/use/' + configs.requestConfig.url; + }); + const res = await post({ url: 'test' }); + expect(res.data.url).toBe('/use/test'); + expect(res.data.method).toBe('post'); + const res2 = await post({ url: 'test2' }); + expect(res2.data.url).toBe('/use/test2'); + }); + test('data', async () => { + const post = req.use({ requestConfig: { url: '/use', method: 'post', data: { a: 1 } } }); + const res = await post({ url: 'test' }); + expect(res.data.data).toEqual({ a: 1 }); + const res2 = await post({ url: 'test', data: { b: 2 } }); + expect(res2.data.data).toEqual({ a: 1, b: 2 }); + }); +}); diff --git a/src/AxiosRequestTemplate.ts b/src/AxiosRequestTemplate.ts index 2d33148..5b2be60 100644 --- a/src/AxiosRequestTemplate.ts +++ b/src/AxiosRequestTemplate.ts @@ -319,8 +319,9 @@ export class AxiosRequestTemplate { } }*/ + // 模板方法,请求入口。 request( - requestConfig: Omit, + requestConfig: Omit & { url: string }, customConfig?: DynamicCustomConfig, ): Promise> : ResType>; async request(requestConfig: AxiosRequestConfig, customConfig = {} as CC): Promise { @@ -369,13 +370,24 @@ export class AxiosRequestTemplate { } // 简单工厂:生成get post delete等method - methodFactory(method: Method) { + methodFactory(method: Method, handler?: (configs: Configs) => void) { return ( - requestConfig: Omit & { url: string }, + requestConfig: Omit & { url: string }, customConfig?: DynamicCustomConfig, - ) => this.request({ ...requestConfig, method }, customConfig); + ) => { + const configs: Configs = { + requestConfig: requestConfig, + customConfig: customConfig || {}, + }; + handler?.(configs); + return this.request( + { ...(configs.requestConfig as any), method }, + configs.customConfig as DynamicCustomConfig, + ); + }; } + // 本质上跟methodFactory其实是一样的 use(configs: Partial>) { const { customConfig: custom = {}, requestConfig: request = {} } = configs; return (