mergeConfig 模块单元测试

合并配置是 ts-axios 核心流程中非常重要的一个环节,我们需要为它的各种情况去编写测试。

测试代码编写

test/mergeConfig.spec.ts

  1. import axios from '../src/index'
  2. import mergeConfig from '../src/core/mergeConfig'
  3. describe('mergeConfig', () => {
  4. const defaults = axios.defaults
  5. test('should accept undefined for second argument', () => {
  6. expect(mergeConfig(defaults, undefined)).toEqual(defaults)
  7. })
  8. test('should accept an object for second argument', () => {
  9. expect(mergeConfig(defaults, {})).toEqual(defaults)
  10. })
  11. test('should not leave references', () => {
  12. const merged = mergeConfig(defaults, {})
  13. expect(merged).not.toBe(defaults)
  14. expect(merged.headers).not.toBe(defaults.headers)
  15. })
  16. test('should allow setting request options', () => {
  17. const config = {
  18. url: '__sample url__',
  19. params: '__sample params__',
  20. data: { foo: true }
  21. }
  22. const merged = mergeConfig(defaults, config)
  23. expect(merged.url).toBe(config.url)
  24. expect(merged.params).toBe(config.params)
  25. expect(merged.data).toEqual(config.data)
  26. })
  27. test('should not inherit request options', () => {
  28. const localDefaults = {
  29. url: '__sample url__',
  30. params: '__sample params__',
  31. data: { foo: true }
  32. }
  33. const merged = mergeConfig(localDefaults, {})
  34. expect(merged.url).toBeUndefined()
  35. expect(merged.params).toBeUndefined()
  36. expect(merged.data).toBeUndefined()
  37. })
  38. test('should return default headers if pass config2 with undefined', () => {
  39. expect(
  40. mergeConfig(
  41. {
  42. headers: 'x-mock-header'
  43. },
  44. undefined
  45. )
  46. ).toEqual({
  47. headers: 'x-mock-header'
  48. })
  49. })
  50. test('should merge auth, headers with defaults', () => {
  51. expect(
  52. mergeConfig(
  53. {
  54. auth: undefined
  55. },
  56. {
  57. auth: {
  58. username: 'foo',
  59. password: 'test'
  60. }
  61. }
  62. )
  63. ).toEqual({
  64. auth: {
  65. username: 'foo',
  66. password: 'test'
  67. }
  68. })
  69. expect(
  70. mergeConfig(
  71. {
  72. auth: {
  73. username: 'foo',
  74. password: 'test'
  75. }
  76. },
  77. {
  78. auth: {
  79. username: 'baz',
  80. password: 'foobar'
  81. }
  82. }
  83. )
  84. ).toEqual({
  85. auth: {
  86. username: 'baz',
  87. password: 'foobar'
  88. }
  89. })
  90. })
  91. test('should overwrite auth, headers with a non-object value', () => {
  92. expect(
  93. mergeConfig(
  94. {
  95. headers: {
  96. common: {
  97. Accept: 'application/json, text/plain, */*'
  98. }
  99. }
  100. },
  101. {
  102. headers: null
  103. }
  104. )
  105. ).toEqual({
  106. headers: null
  107. })
  108. })
  109. test('should allow setting other options', () => {
  110. const merged = mergeConfig(defaults, {
  111. timeout: 123
  112. })
  113. expect(merged.timeout).toBe(123)
  114. })
  115. })

运行测试后我们发现 mergeConfig.ts 文件的分支覆盖率并未达到 100%,提示是 23 行,打开文件后发现最后一个 else 逻辑并未走到,也就是 val1undefined 的情况。但实际上即使 val1undefined,我们也是返回 undefined,也就是返回 val1,所以这块代码的逻辑可以优化。

  1. function deepMergeStrat(val1: any, val2: any): any {
  2. if (isPlainObject(val2)) {
  3. return deepMerge(val1, val2)
  4. } else if (typeof val2 !== 'undefined') {
  5. return val2
  6. } else if (isPlainObject(val1)) {
  7. return deepMerge(val1)
  8. } else {
  9. return val1
  10. }
  11. }

2 个分支可以合并到一个分支,这样我们再次跑测试,分支覆盖率就可以达到 100% 了。

至此我们完成了 ts-axios 库对 mergeConfig 模块的测试,下一节课我们来测试取消模块相关代码。