合并配置是 ts-axios 核心流程中非常重要的一个环节,我们需要为它的各种情况去编写测试。
测试代码编写
test/mergeConfig.spec.ts:
import axios from '../src/index'import mergeConfig from '../src/core/mergeConfig'describe('mergeConfig', () => {const defaults = axios.defaultstest('should accept undefined for second argument', () => {expect(mergeConfig(defaults, undefined)).toEqual(defaults)})test('should accept an object for second argument', () => {expect(mergeConfig(defaults, {})).toEqual(defaults)})test('should not leave references', () => {const merged = mergeConfig(defaults, {})expect(merged).not.toBe(defaults)expect(merged.headers).not.toBe(defaults.headers)})test('should allow setting request options', () => {const config = {url: '__sample url__',params: '__sample params__',data: { foo: true }}const merged = mergeConfig(defaults, config)expect(merged.url).toBe(config.url)expect(merged.params).toBe(config.params)expect(merged.data).toEqual(config.data)})test('should not inherit request options', () => {const localDefaults = {url: '__sample url__',params: '__sample params__',data: { foo: true }}const merged = mergeConfig(localDefaults, {})expect(merged.url).toBeUndefined()expect(merged.params).toBeUndefined()expect(merged.data).toBeUndefined()})test('should return default headers if pass config2 with undefined', () => {expect(mergeConfig({headers: 'x-mock-header'},undefined)).toEqual({headers: 'x-mock-header'})})test('should merge auth, headers with defaults', () => {expect(mergeConfig({auth: undefined},{auth: {username: 'foo',password: 'test'}})).toEqual({auth: {username: 'foo',password: 'test'}})expect(mergeConfig({auth: {username: 'foo',password: 'test'}},{auth: {username: 'baz',password: 'foobar'}})).toEqual({auth: {username: 'baz',password: 'foobar'}})})test('should overwrite auth, headers with a non-object value', () => {expect(mergeConfig({headers: {common: {Accept: 'application/json, text/plain, */*'}}},{headers: null})).toEqual({headers: null})})test('should allow setting other options', () => {const merged = mergeConfig(defaults, {timeout: 123})expect(merged.timeout).toBe(123)})})
运行测试后我们发现 mergeConfig.ts 文件的分支覆盖率并未达到 100%,提示是 23 行,打开文件后发现最后一个 else 逻辑并未走到,也就是 val1 为 undefined 的情况。但实际上即使 val1 为 undefined,我们也是返回 undefined,也就是返回 val1,所以这块代码的逻辑可以优化。
function deepMergeStrat(val1: any, val2: any): any {if (isPlainObject(val2)) {return deepMerge(val1, val2)} else if (typeof val2 !== 'undefined') {return val2} else if (isPlainObject(val1)) {return deepMerge(val1)} else {return val1}}
2 个分支可以合并到一个分支,这样我们再次跑测试,分支覆盖率就可以达到 100% 了。
至此我们完成了 ts-axios 库对 mergeConfig 模块的测试,下一节课我们来测试取消模块相关代码。
